Compare commits

..

No commits in common. "master" and "2126.0-alpha1" have entirely different histories.

71 changed files with 6725 additions and 7054 deletions

View file

@ -12,9 +12,9 @@ fi
echo "Tag name is: $TAG_NAME"
docker build --no-cache -f docker/azahar-room/Dockerfile -t azahar-room:$TAG_NAME .
docker build -f docker/azahar-room/Dockerfile -t azahar-room:$TAG_NAME .
mkdir -p build
FILENAME="azahar-room-$TARGET-$TAG_NAME.dockerimage"
FILENAME="azahar-room-$TAG_NAME.dockerimage"
docker save azahar-room:$TAG_NAME > build/$FILENAME
echo "DOCKER_IMAGE_PATH=artifacts/$FILENAME" >> $GITHUB_ENV
echo "DOCKER_IMAGE_PATH=artifacts/$FILENAME" >> $GITHUB_ENV

View file

@ -17,7 +17,7 @@ jobs:
if: ${{ !github.head_ref }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Pack
@ -31,7 +31,7 @@ jobs:
output-file: artifacts/source.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: source
path: artifacts/
@ -61,13 +61,13 @@ jobs:
SHOULD_RUN: ${{ (matrix.target != 'appimage-wayland' || github.ref_type == 'tag') }}
CACHE_ENABLED: ${{ github.ref_type != 'tag' }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
if: ${{ env.SHOULD_RUN == 'true' }}
with:
submodules: recursive
- name: Set up cache
if: ${{ env.SHOULD_RUN == 'true' && env.CACHE_ENABLED == 'true' }}
uses: actions/cache@v5
uses: actions/cache@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ github.job }}-${{ matrix.target }}-${{ github.sha }}
@ -95,7 +95,7 @@ jobs:
upload-artifact: false
- name: Upload
if: ${{ contains(matrix.target, 'appimage') && env.SHOULD_RUN == 'true' }}
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ github.job }}-${{ matrix.target }}
path: artifacts/
@ -123,11 +123,11 @@ jobs:
OS: linux
TARGET: ${{ matrix.target }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up cache
uses: actions/cache@v5
uses: actions/cache@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ github.job }}-${{ matrix.target }}-${{ github.sha }}
@ -145,12 +145,12 @@ jobs:
CACHE_ENABLED: ${{ github.ref_type != 'tag' }}
OS: macos
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up cache
if: ${{ env.CACHE_ENABLED == 'true' }}
uses: actions/cache@v5
uses: actions/cache@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ runner.os }}-${{ github.sha }}
@ -183,7 +183,7 @@ jobs:
output-file: artifacts/macos.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}
path: artifacts/
@ -222,12 +222,12 @@ jobs:
OS: windows
TARGET: ${{ matrix.target }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up cache
if: ${{ env.CACHE_ENABLED == 'true' }}
uses: actions/cache@v5
uses: actions/cache@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
@ -235,7 +235,7 @@ jobs:
${{ runner.os }}-${{ matrix.target }}-
- name: Set up MSVC
if: ${{ matrix.target == 'msvc' }}
uses: azahar-emu/msvc-dev-cmd@v1
uses: ilammy/msvc-dev-cmd@v1
- name: Install extra tools (MSVC)
if: ${{ matrix.target == 'msvc' }}
run: choco install ccache ninja ptime wget
@ -256,7 +256,7 @@ jobs:
qt6-base:p qt6-multimedia:p qt6-multimedia-wmf:p qt6-tools:p qt6-translations:p
- name: Install extra tools (MSYS2)
if: ${{ matrix.target == 'msys2' }}
uses: crazy-max/ghaction-chocolatey@v4
uses: crazy-max/ghaction-chocolatey@v3
with:
args: install ptime wget
- name: Install NSIS
@ -300,7 +300,7 @@ jobs:
output-file: artifacts/windows-${{ matrix.target }}.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}-${{ env.TARGET }}
path: artifacts/
@ -328,13 +328,13 @@ jobs:
TARGET: ${{ matrix.target }}
SHOULD_RUN: ${{ (matrix.target == 'vanilla' || github.ref_type == 'tag') }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
if: ${{ env.SHOULD_RUN == 'true' }}
with:
submodules: recursive
- name: Set up cache
if: ${{ env.SHOULD_RUN == 'true' && env.CACHE_ENABLED == 'true' }}
uses: actions/cache@v5
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
@ -382,7 +382,7 @@ jobs:
upload-artifact: false
- name: Upload
if: ${{ env.SHOULD_RUN == 'true' }}
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}-${{ env.TARGET }}
path: src/android/app/artifacts/
@ -396,24 +396,15 @@ jobs:
sbom-path: src/android/app/artifacts/android-${{ matrix.target }}.spdx.json
docker:
strategy:
fail-fast: false
matrix:
include:
- target: x86_64
os: ubuntu-24.04
- target: arm64
os: ubuntu-24.04-arm
runs-on: ${{ matrix.os }}
runs-on: ubuntu-latest
container:
# Can't use docker:dind for ARM64 because it's Alpine-based, see https://github.com/actions/upload-artifact/issues/739
image: earthbuild/dind:ubuntu-24.04-docker-28.5.2-1
env:
TARGET: ${{ matrix.target }}
image: docker:dind
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install tools
run: apk add bash
- name: Fix git ownership
run: git config --global --add safe.directory .
- name: Build Docker image
@ -431,9 +422,9 @@ jobs:
output-file: artifacts/docker-room.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: docker-${{ env.TARGET }}
name: docker
path: artifacts/
- name: Attest artifacts
if: ${{ github.ref_type == 'tag' }}

View file

@ -20,7 +20,7 @@ jobs:
(github.event.pull_request.author_association != 'OWNER')
steps:
- name: Detect PR if author is first-time contributor
uses: actions/github-script@v9
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;

View file

@ -14,7 +14,7 @@ jobs:
if: github.event.issue.pull_request && contains(github.event.issue.labels.*.name, 'needs verification')
steps:
- name: Verify and reopen PR
uses: actions/github-script@v9
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;

View file

@ -13,7 +13,7 @@ jobs:
image: opensauce04/azahar-build-environment:latest
options: -u 1001
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build

View file

@ -28,7 +28,7 @@ jobs:
BUILD_DIR: build/android-arm64-v8a
EXTRA_PATH: bin/Release
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Set tag name
@ -62,7 +62,7 @@ jobs:
output-file: libretro-android.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}-${{ env.TARGET }}
path: |
@ -85,7 +85,7 @@ jobs:
EXTRA_PATH: bin/Release
EXTRA_CORE_ARGS: -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DENABLE_LTO=OFF
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install tools
@ -108,7 +108,7 @@ jobs:
output-file: libretro-linux.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}-${{ env.TARGET }}
path: |
@ -133,7 +133,7 @@ jobs:
IMAGE: reallibretroretroarch/libretro-build-mxe-win-cross-cores:mingw12
EXTRA_PATH: bin/Release
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Build in cross-container
@ -158,7 +158,7 @@ jobs:
output-file: libretro-windows.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}-${{ env.TARGET }}
path: |
@ -174,7 +174,6 @@ jobs:
macos:
runs-on: macos-26
strategy:
fail-fast: false
matrix:
target: ["x86_64", "arm64"]
env:
@ -184,7 +183,7 @@ jobs:
BUILD_DIR: build/osx-${{ matrix.target }}
EXTRA_PATH: bin/Release
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install tools
@ -205,7 +204,7 @@ jobs:
output-file: libretro-macos-${{ matrix.target }}.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}-${{ env.TARGET }}
path: |
@ -228,7 +227,7 @@ jobs:
EXTRA_PATH: bin/Release
EXTRA_CORE_ARGS: -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_FLAGS=-DIOS -DCMAKE_CXX_FLAGS=-DIOS -DIOS=ON -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCITRA_USE_PRECOMPILED_HEADERS=OFF -DCMAKE_OSX_ARCHITECTURES=arm64 -DENABLE_OPT=OFF
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Build
@ -247,7 +246,7 @@ jobs:
output-file: libretro-ios.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}-${{ env.TARGET }}
path: |
@ -270,7 +269,7 @@ jobs:
EXTRA_PATH: bin/Release
EXTRA_CORE_ARGS: -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_FLAGS=-DIOS -DCMAKE_CXX_FLAGS=-DIOS -DIOS=ON -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCITRA_USE_PRECOMPILED_HEADERS=OFF -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_ARCHITECTURES=arm64 -DENABLE_OPT=OFF
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Build
@ -289,7 +288,7 @@ jobs:
output-file: libretro-tvos.spdx.json
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v4
with:
name: ${{ env.OS }}-${{ env.TARGET }}
path: |

View file

@ -11,7 +11,7 @@ jobs:
image: opensauce04/azahar-build-environment:latest
options: -u 1001
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Fetch master branch

View file

@ -10,7 +10,7 @@ jobs:
permissions:
issues: write
steps:
- uses: actions/stale@v10.2.0
- uses: actions/stale@v9.1.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-issue-stale: 90

View file

@ -10,7 +10,7 @@ jobs:
container: opensauce04/azahar-build-environment:latest
if: ${{ github.repository == 'azahar-emu/azahar' }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0

9
.gitmodules vendored
View file

@ -55,6 +55,12 @@
[submodule "sdl2"]
path = externals/sdl2/SDL
url = https://github.com/libsdl-org/SDL
[submodule "cryptopp-cmake"]
path = externals/cryptopp-cmake
url = https://github.com/abdes/cryptopp-cmake.git
[submodule "cryptopp"]
path = externals/cryptopp
url = https://github.com/weidai11/cryptopp.git
[submodule "dds-ktx"]
path = externals/dds-ktx
url = https://github.com/septag/dds-ktx
@ -103,6 +109,3 @@
[submodule "dllwalker"]
path = externals/dllwalker
url = https://github.com/azahar-emu/dllwalker
[submodule "externals/cryptopp"]
path = externals/cryptopp
url = https://github.com/cryptopp-modern/cryptopp-modern.git

View file

@ -411,21 +411,13 @@ if (APPLE)
endif()
find_library(AVFOUNDATION_LIBRARY AVFoundation REQUIRED)
find_library(IOSURFACE_LIBRARY IOSurface REQUIRED)
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${IOSURFACE_LIBRARY})
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${IOSURFACE_LIBRARY} ${MOLTENVK_LIBRARY})
if (ENABLE_VULKAN AND NOT ENABLE_LIBRETRO)
if (USE_SYSTEM_MOLTENVK)
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
else()
if (NOT USE_SYSTEM_MOLTENVK)
download_moltenvk()
if (IOS)
set(MOLTENVK_RELATIVE_LIBPATH "static/MoltenVK.xcframework/ios-arm64/libMoltenVK.a")
else()
set(MOLTENVK_RELATIVE_LIBPATH "dynamic/dylib/macOS/libMoltenVK.dylib")
endif()
set(MOLTENVK_LIBRARY "${CMAKE_BINARY_DIR}/externals/MoltenVK/MoltenVK/${MOLTENVK_RELATIVE_LIBPATH}")
endif()
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.")
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} ${MOLTENVK_LIBRARY})
endif()

View file

@ -171,8 +171,15 @@ function(download_qt target)
endfunction()
function(download_moltenvk)
if (IOS)
set(MOLTENVK_PLATFORM "static/MoltenVK.xcframework/ios-arm64")
else()
set(MOLTENVK_PLATFORM "dynamic/dylib/macOS")
endif()
set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
if (NOT EXISTS "${CMAKE_BINARY_DIR}/externals/MoltenVK")
if (NOT EXISTS ${MOLTENVK_DIR})
if (NOT EXISTS ${MOLTENVK_TAR})
file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/v1.2.9/MoltenVK-all.tar
${MOLTENVK_TAR} SHOW_PROGRESS)
@ -181,6 +188,10 @@ function(download_moltenvk)
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
endif()
# Add the MoltenVK library path to the prefix so find_library can locate it.
list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/${MOLTENVK_PLATFORM}")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
endfunction()
function(get_external_prefix lib_name prefix_var)

View file

@ -12,4 +12,4 @@ lang_map = ca@valencia:ca_ES_valencia
file_filter = ../../src/android/app/src/main/res/values-<lang>/strings.xml
source_file = ../../src/android/app/src/main/res/values/strings.xml
type = ANDROID
lang_map = ca@valencia:b+ca+ES+valencia, es_419:b+es+419, pt_BR:b+pt+BR, zh_CN:b+zh+CN, zh_TW:b+zh+TW
lang_map = es_ES:b+es+ES, hu_HU:b+hu+HU, ru_RU:b+ru+RU, pt_BR:b+pt+BR, zh_CN:b+zh+CN, pl_PL:b+pl+PL, ca@valencia:b+ca+ES+valencia, ko_KR:b+ko+KR, da_DK:b+da+DK, ja_JP:b+ja+JP, lt_LT:b+lt+LT, ro_RO:b+ro+RO, tr_TR:b+tr+TR, vi_VN:b+vi+VN, zh_TW:b+zh+TW, es_419:b+es+419

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

536
dist/languages/de.ts vendored

File diff suppressed because it is too large Load diff

536
dist/languages/el.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

536
dist/languages/fi.ts vendored

File diff suppressed because it is too large Load diff

536
dist/languages/fr.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

536
dist/languages/id.ts vendored

File diff suppressed because it is too large Load diff

536
dist/languages/it.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

536
dist/languages/nb.ts vendored

File diff suppressed because it is too large Load diff

536
dist/languages/nl.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

536
dist/languages/sv.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -4,19 +4,24 @@
# --- Builder ----------------
FROM opensauce04/azahar-build-environment:latest AS builder
RUN mkdir /var/azahar-src/
COPY ./ /var/azahar-src/
COPY . /var/azahar-src
RUN mkdir ./builddir/
WORKDIR ./builddir/
RUN cmake /var/azahar-src -G Ninja \
RUN mkdir builddir && cd builddir && \
cmake /var/azahar-src -G Ninja \
-DENABLE_QT=OFF \
-DENABLE_GDBSTUB=OFF \
-DENABLE_TESTS=OFF \
-DENABLE_ROOM=ON \
-DENABLE_ROOM_STANDALONE=ON
RUN ninja
RUN mv ./bin/Release/azahar-room /usr/local/bin/
-DENABLE_ROOM_STANDALONE=ON \
-DENABLE_OPENGL=OFF $( : "TODO: Can we disable these automatically when there's no frontend?") \
-DENABLE_VULKAN=OFF \
-DENABLE_SDL2=OFF \
-DENABLE_LIBUSB=OFF \
-DENABLE_CUBEB=OFF \
-DENABLE_OPENAL=OFF && \
ninja && \
mv bin/Release/azahar-room /usr/local/bin/ && \
cd .. && rm -rf builddir
# --- Final ------------------
FROM debian:trixie AS final

View file

@ -69,9 +69,17 @@ if(USE_SYSTEM_CRYPTOPP)
add_library(cryptopp INTERFACE)
target_link_libraries(cryptopp INTERFACE cryptopp::cryptopp)
else()
if (WIN32 AND NOT MSVC AND "arm64" IN_LIST ARCHITECTURE)
# TODO: CryptoPP ARM64 ASM does not seem to support Windows unless compiled with MSVC.
# TODO: See https://github.com/weidai11/cryptopp/issues/1260
set(CRYPTOPP_DISABLE_ASM ON CACHE BOOL "")
endif()
set(CRYPTOPP_BUILD_DOCUMENTATION OFF CACHE BOOL "")
set(CRYPTOPP_BUILD_TESTING OFF CACHE BOOL "")
set(CRYPTOPP_INSTALL OFF CACHE BOOL "")
add_subdirectory(cryptopp EXCLUDE_FROM_ALL)
set(CRYPTOPP_SOURCES "${CMAKE_SOURCE_DIR}/externals/cryptopp" CACHE STRING "")
add_subdirectory(cryptopp-cmake EXCLUDE_FROM_ALL)
endif()
# dds-ktx

2
externals/cryptopp vendored

@ -1 +1 @@
Subproject commit 8d92d788421483a43e09acf1cd4a2861cb2b8cab
Subproject commit 60f81a77e0c9a0e7ffc1ca1bc438ddfa2e43b78e

1
externals/cryptopp-cmake vendored Submodule

@ -0,0 +1 @@
Subproject commit 00a151f8489daaa32434ab1f340e6750793ddf0c

View file

@ -4,8 +4,6 @@
package org.citra.citra_emu.features.settings.model
import org.citra.citra_emu.features.settings.SettingKeys
enum class IntListSetting(
override val key: String,
override val section: String,
@ -13,7 +11,7 @@ enum class IntListSetting(
val canBeEmpty: Boolean = true
) : AbstractListSetting<Int> {
LAYOUTS_TO_CYCLE(SettingKeys.layouts_to_cycle(), Settings.SECTION_LAYOUT, listOf(0, 1, 2, 3, 4, 5), canBeEmpty = false);
LAYOUTS_TO_CYCLE("layouts_to_cycle", Settings.SECTION_LAYOUT, listOf(0, 1, 2, 3, 4, 5), canBeEmpty = false);
private var backingList: List<Int> = defaultValue
private var lastValidList : List<Int> = defaultValue

View file

@ -339,13 +339,14 @@ void Config::Reload() {
for (auto key = Settings::Keys::keys_array.begin(); key != Settings::Keys::keys_array.end();
++key) {
const auto key_declaration_string = std::string(*key) + " =";
if ((std::ranges::find(DefaultINI::android_config_omitted_keys, *key) ==
std::end(DefaultINI::android_config_omitted_keys)) &&
(std::string(DefaultINI::android_config_default_file_content)
.find(key_declaration_string) == std::string::npos)) {
// FIXME: This code looks so ass when formatted by clang-format -OS
if (std::ranges::find(DefaultINI::android_config_omitted_keys, *key) ==
std::end(DefaultINI::android_config_omitted_keys) &&
std::string(DefaultINI::android_config_default_file_content)
.find(key_declaration_string) == std::string::npos) {
ASSERT_MSG(false,
"Validation of default config content (jni/default_ini.h) failed: Missing "
"declaration for key '{}'",
"Validation of default content config failed: Missing or malformed key "
"declaration {}",
*key);
}
}

View file

@ -57,9 +57,7 @@
#include "citra_qt/debugger/graphics/graphics_vertex_shader.h"
#include "citra_qt/debugger/ipc/recorder.h"
#include "citra_qt/debugger/lle_service_modules.h"
#if MICROPROFILE_ENABLED
#include "citra_qt/debugger/profiler.h"
#endif
#include "citra_qt/debugger/registers.h"
#include "citra_qt/debugger/wait_tree.h"
#ifdef USE_DISCORD_PRESENCE
@ -714,6 +712,11 @@ void GMainWindow::InitializeDebugWidgets() {
microProfileDialog = new MicroProfileDialog(this);
microProfileDialog->hide();
debug_menu->addAction(microProfileDialog->toggleViewAction());
#else
auto micro_profile_stub = new QAction(tr("MicroProfile (unavailable)"), this);
micro_profile_stub->setEnabled(false);
micro_profile_stub->setChecked(false);
debug_menu->addAction(micro_profile_stub);
#endif
registersWidget = new RegistersWidget(system, this);
@ -876,8 +879,6 @@ void GMainWindow::InitializeHotkeys() {
link_action_shortcut(ui->action_Debug_Pause, QStringLiteral("Debug Pause"));
link_action_shortcut(ui->action_Debug_Resume, QStringLiteral("Debug Resume"));
link_action_shortcut(ui->action_Debug_Step, QStringLiteral("Debug Step"), false, true);
link_action_shortcut(ui->action_Debug_Unschedule_All, QStringLiteral("Debug Unschedule All"));
link_action_shortcut(ui->action_Debug_Schedule_All, QStringLiteral("Debug Schedule All"));
link_action_shortcut(ui->action_Screen_Layout_Swap_Screens, QStringLiteral("Swap Screens"));
link_action_shortcut(ui->action_Screen_Layout_Upright_Screens,
QStringLiteral("Rotate Screens Upright"));
@ -1208,10 +1209,6 @@ void GMainWindow::ConnectMenuEvents() {
emu_thread->ExecStep();
}
});
connect_menu(ui->action_Debug_Unschedule_All,
[this] { system.DebugUnscheduleAllThreadsFromFrontend(true); });
connect_menu(ui->action_Debug_Schedule_All,
[this] { system.DebugUnscheduleAllThreadsFromFrontend(false); });
// Tools
connect_menu(ui->action_Compress_ROM_File, &GMainWindow::OnCompressFile);

View file

@ -57,17 +57,15 @@ const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> QtConfi
// This must be in alphabetical order according to action name as it must have the same order as
// UISetting::values.shortcuts, which is alphabetically ordered.
// clang-format off
const std::array<UISettings::Shortcut, 43> QtConfig::default_hotkeys {{
const std::array<UISettings::Shortcut, 41> QtConfig::default_hotkeys {{
{QStringLiteral("Advance Frame"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::ApplicationShortcut}},
{QStringLiteral("Audio Mute/Unmute"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}},
{QStringLiteral("Audio Volume Down"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
{QStringLiteral("Audio Volume Up"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
{QStringLiteral("Capture Screenshot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Debug Pause"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Debug Resume"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Debug Step"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Debug Unschedule All"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Debug Schedule All"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Debug Pause"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F4"),Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Debug Resume"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F5"),Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Debug Step"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F6"),Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), Qt::WindowShortcut}},
{QStringLiteral("Decrease 3D Factor"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+-"), Qt::ApplicationShortcut}},
{QStringLiteral("Decrease Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("-"), Qt::ApplicationShortcut}},

View file

@ -26,7 +26,7 @@ public:
static const std::array<int, Settings::NativeButton::NumButtons> default_buttons;
static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs;
static const std::array<UISettings::Shortcut, 43> default_hotkeys;
static const std::array<UISettings::Shortcut, 41> default_hotkeys;
private:
void Initialize(const std::string& config_name);

View file

@ -213,9 +213,6 @@
<addaction name="action_Debug_Pause"/>
<addaction name="action_Debug_Resume"/>
<addaction name="action_Debug_Step"/>
<addaction name="separator"/>
<addaction name="action_Debug_Unschedule_All"/>
<addaction name="action_Debug_Schedule_All"/>
</widget>
<addaction name="menu_Debug"/>
<addaction name="separator"/>
@ -490,22 +487,6 @@
<string>Debug Step</string>
</property>
</action>
<action name="action_Debug_Unschedule_All">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Debug Unschedule All</string>
</property>
</action>
<action name="action_Debug_Schedule_All">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Debug Schedule All</string>
</property>
</action>
<action name="action_Dump_Video">
<property name="checkable">
<bool>true</bool>

View file

@ -833,19 +833,6 @@ bool System::IsInitialSetup() {
return app_loader && app_loader->DoingInitialSetup();
}
void System::DebugUnscheduleAllThreadsFromFrontend(bool unschedule) {
if (!is_powered_on)
return;
for (auto proc : kernel->GetProcessList()) {
if (unschedule) {
proc->SetUnscheduleMode(Kernel::UnscheduleMode::FRONTEND);
} else {
proc->ClearUnscheduleMode(Kernel::UnscheduleMode::FRONTEND);
}
}
}
template <class Archive>
void System::serialize(Archive& ar, const unsigned int file_version) {

View file

@ -419,8 +419,6 @@ public:
debug_next_process = false;
}
void DebugUnscheduleAllThreadsFromFrontend(bool unschedule);
private:
/**
* Initialize the emulated system.

View file

@ -877,7 +877,7 @@ static void HandleGetStopReason() {
for (const auto& process : process_list) {
if (process->codeset->program_id == program_id) {
current_process = process.get();
current_process->SetUnscheduleMode(Kernel::UnscheduleMode::GDB);
current_process->SetDebugBreak(true);
is_running = false;
if (SetThread(0)) {
SendStopReply(current_thread, 0);
@ -900,7 +900,7 @@ static void BreakImpl(int signal) {
"and memory exceptions. Disable CPU JIT for more accuracy.");
}
current_process->SetUnscheduleMode(Kernel::UnscheduleMode::GDB);
current_process->SetDebugBreak(true);
is_running = false;
latest_signal = signal;
@ -1248,7 +1248,7 @@ static void Continue() {
continue_list.push_back(thread_id);
}
current_process->ClearUnscheduleMode(Kernel::UnscheduleMode::GDB, continue_list);
current_process->SetDebugBreak(false, continue_list);
is_running = true;
ClearAllInstructionCache();
@ -1414,7 +1414,7 @@ void HandleVCommand() {
SendReply("E02");
} else {
current_process = process.get();
current_process->SetUnscheduleMode(Kernel::UnscheduleMode::GDB);
current_process->SetDebugBreak(true);
is_running = false;
if (SetThread(0)) {
SendStopReply(current_thread, 0);
@ -1456,7 +1456,7 @@ void HandleVCommand() {
HexToInt(reinterpret_cast<const u8*>(threads[i].c_str()), threads[i].size()));
}
current_process->ClearUnscheduleMode(Kernel::UnscheduleMode::GDB, thread_ids);
current_process->SetDebugBreak(false, thread_ids);
is_running = true;
}
} else {

View file

@ -270,7 +270,7 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) {
#ifdef ENABLE_GDBSTUB
if (GDBStub::IsServerEnabled()) {
LOG_INFO(Loader, "Pausing process {} at start", process_id);
SetUnscheduleMode(Kernel::UnscheduleMode::GDB);
SetDebugBreak(true);
}
#endif
Core::System::GetInstance().ClearDebugNextProcessFlag();
@ -624,8 +624,7 @@ std::vector<std::shared_ptr<Kernel::Thread>> Kernel::Process::GetThreadList() {
return ret;
}
void Kernel::Process::ChangeUnscheduleMode(UnscheduleMode mode, std::vector<u32> thread_ids,
bool set) {
void Kernel::Process::SetDebugBreak(bool debug_break, std::vector<u32> thread_ids) {
auto thread_list = GetThreadList();
bool needs_reschedule = false;
for (auto& t : thread_list) {
@ -637,7 +636,7 @@ void Kernel::Process::ChangeUnscheduleMode(UnscheduleMode mode, std::vector<u32>
}
}
needs_reschedule |= (set ? t->SetUnscheduleMode(mode) : t->ClearUnscheduleMode(mode));
needs_reschedule |= t->SetDebugBreak(debug_break);
}
if (needs_reschedule) {

View file

@ -13,7 +13,6 @@
#include <boost/container/static_vector.hpp>
#include <boost/serialization/export.hpp>
#include "common/bit_field.h"
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "core/hle/kernel/handle_table.h"
#include "core/hle/kernel/object.h"
@ -52,13 +51,6 @@ union ProcessFlags {
BitField<12, 1, u16> loaded_high; ///< Application loaded high (not at 0x00100000).
};
enum class UnscheduleMode : u32 {
SVC = (1 << 0),
GDB = (1 << 1),
FRONTEND = (1 << 2),
};
DECLARE_ENUM_FLAG_OPERATORS(UnscheduleMode);
enum class ProcessStatus { Created, Running, Exited };
class ResourceLimit;
@ -236,15 +228,9 @@ public:
std::vector<std::shared_ptr<Kernel::Thread>> GetThreadList();
void SetUnscheduleMode(UnscheduleMode mode, std::vector<u32> thread_ids = {}) {
ChangeUnscheduleMode(mode, thread_ids, true);
}
void ClearUnscheduleMode(UnscheduleMode mode, std::vector<u32> thread_ids = {}) {
ChangeUnscheduleMode(mode, thread_ids, false);
}
void SetDebugBreak(bool debug_break, std::vector<u32> thread_ids = {});
private:
void ChangeUnscheduleMode(UnscheduleMode mode, std::vector<u32> thread_ids, bool set);
void FreeAllMemory();
KernelSystem& kernel;

View file

@ -2191,11 +2191,7 @@ Result SVC::ControlProcess(Handle process_handle, u32 process_OP, u32 varg2, u32
kernel.GetCurrentThreadManager().GetCurrentThread()->thread_id) {
continue;
}
if (varg2) {
thread->SetUnscheduleMode(Kernel::UnscheduleMode::SVC);
} else {
thread->ClearUnscheduleMode(Kernel::UnscheduleMode::SVC);
}
thread.get()->can_schedule = !varg2;
}
}
return ResultSuccess;

View file

@ -80,7 +80,7 @@ void Thread::serialize(Archive& ar, const unsigned int file_version) {
}
}
ar & wakeup_callback;
ar & unschedule_mode;
ar & debug_break;
}
SERIALIZE_IMPL(Thread)
@ -545,20 +545,12 @@ VAddr Thread::GetCommandBufferAddress() const {
return GetTLSAddress() + command_header_offset;
}
bool Thread::SetUnscheduleMode(UnscheduleMode mode) {
UnscheduleMode old = unschedule_mode;
unschedule_mode |= mode;
return unschedule_mode != old;
}
bool Thread::ClearUnscheduleMode(UnscheduleMode mode) {
UnscheduleMode old = unschedule_mode;
unschedule_mode &= ~mode;
return unschedule_mode != old;
bool Thread::SetDebugBreak(bool _debug_break) {
if (debug_break == _debug_break) {
return false;
}
debug_break = _debug_break;
return true;
}
CpuLimiter::~CpuLimiter() {}

View file

@ -21,7 +21,6 @@
#include "core/arm/arm_interface.h"
#include "core/core_timing.h"
#include "core/hle/kernel/object.h"
#include "core/hle/kernel/process.h"
#include "core/hle/kernel/resource_limit.h"
#include "core/hle/kernel/wait_object.h"
#include "core/hle/result.h"
@ -29,6 +28,7 @@
namespace Kernel {
class Mutex;
class Process;
enum ThreadPriority : u32 {
ThreadPrioHighest = 0, ///< Highest thread priority
@ -366,16 +366,19 @@ public:
}
bool CanSchedule() {
return static_cast<u32>(unschedule_mode) == 0;
// TODO(PabloMK7): This may not be the proper way
// threads are marked as non-schedulable when they
// are in debug break. Figure out and fix.
return can_schedule && !debug_break;
}
bool SetUnscheduleMode(UnscheduleMode mode);
bool ClearUnscheduleMode(UnscheduleMode mode);
bool SetDebugBreak(bool debug_break);
Core::ARM_Interface::ThreadContext context{};
u32 thread_id;
bool can_schedule{true};
ThreadStatus status;
VAddr entry_point;
VAddr stack_top;
@ -416,10 +419,7 @@ public:
private:
ThreadManager& thread_manager;
// Does not represent how real HW works, instead it mimics behaviour
// taking into account how our scheduler works.
UnscheduleMode unschedule_mode{};
bool debug_break{};
friend class boost::serialization::access;
template <class Archive>

View file

@ -60,7 +60,7 @@ void Directory::Read(Kernel::HLERequestContext& ctx) {
ctx.RunAsync(
[this, async_data](Kernel::HLERequestContext& ctx) {
std::vector<FileSys::Entry> entries(async_data->count);
LOG_TRACE(Service_FS, "Read {}: count={}", GetName(), async_data->count);
LOG_TRACE(Service_FS, "Read {}: count={}", GetName(), count);
// Number of entries actually read
async_data->read = backend->Read(static_cast<u32>(entries.size()), entries.data());
async_data->buffer->Write(entries.data(), 0, async_data->read * sizeof(FileSys::Entry));

View file

@ -58,9 +58,6 @@ void PicaCore::InitializeRegs() {
// Values initialized by GSP
regs.internal.irq_autostop = 1;
regs.internal.irq_mask = 0xFFFFFFF0;
// Older versions of libctru didn't initialize this, initialize it here to avoid endless black
// screen. Not needed on actual hardware due to previous software already having set it up
regs.internal.irq_compare = 0x12345678;
auto& framebuffer_top = regs.framebuffer_config[0];
auto& framebuffer_sub = regs.framebuffer_config[1];

View file

@ -666,21 +666,8 @@ void RasterizerOpenGL::SyncTextureUnits(const Framebuffer* framebuffer) {
// If the texture unit is disabled unbind the corresponding gl unit
if (!texture.enabled) {
switch (texture.config.type.Value()) {
case TextureType::TextureCube:
case TextureType::ShadowCube: {
state.texture_units[texture_index].texture_2d =
res_cache.GetSurface(VideoCore::NULL_SURFACE_CUBE_ID).Handle();
state.texture_units[texture_index].target = GL_TEXTURE_CUBE_MAP;
break;
}
default: {
state.texture_units[texture_index].texture_2d =
res_cache.GetSurface(VideoCore::NULL_SURFACE_ID).Handle();
state.texture_units[texture_index].target = GL_TEXTURE_2D;
break;
}
}
const Surface& null_surface = res_cache.GetSurface(VideoCore::NULL_SURFACE_ID);
state.texture_units[texture_index].texture_2d = null_surface.Handle();
continue;
}

View file

@ -72,7 +72,6 @@ void FragmentModule::Generate() {
break;
case TexturingRegs::FogMode::Gas:
WriteGas();
// Return early due to unimplemented gas mode
return;
default:
break;
@ -197,12 +196,7 @@ void FragmentModule::WriteFog() {
void FragmentModule::WriteGas() {
// TODO: Implement me
LOG_CRITICAL(Render, "Unimplemented gas mode");
// Replace the output color with a transparent pixel,
// (just discarding the pixel causes graphical issues
// in some MH games).
OpStore(color_id, ConstF32(0.f, 0.f, 0.f, 0.f));
OpReturn();
OpKill();
OpFunctionEnd();
}