Compare commits
7 commits
5772537164
...
63b9d22235
Author | SHA1 | Date | |
---|---|---|---|
63b9d22235 | |||
f54161b6ab | |||
b4246491a1 | |||
7745832f69 | |||
71dc7e72c2 | |||
4c5d03f5de | |||
d207df959a |
35 changed files with 402 additions and 262 deletions
|
@ -159,8 +159,6 @@ option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
|||
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
|
||||
|
||||
option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ${EXT_DEFAULT})
|
||||
option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan Utility Headers from externals" ${EXT_DEFAULT})
|
||||
option(YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" ${EXT_DEFAULT})
|
||||
|
||||
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
||||
|
||||
|
@ -172,8 +170,6 @@ option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
|||
|
||||
CMAKE_DEPENDENT_OPTION(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF "ENABLE_QT" OFF)
|
||||
|
||||
option(ENABLE_MICROPROFILE "Enables microprofile capabilities" OFF)
|
||||
|
||||
option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
||||
|
||||
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT})
|
||||
|
@ -455,6 +451,28 @@ if (YUZU_USE_CPM)
|
|||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# VulkanUtilityHeaders - pulls in headers and utility libs
|
||||
AddJsonPackage(vulkan-utility-headers)
|
||||
|
||||
# small hack
|
||||
if (NOT VulkanUtilityLibraries_ADDED)
|
||||
find_package(VulkanHeaders 1.3.274 REQUIRED)
|
||||
endif()
|
||||
|
||||
# SPIRV Headers
|
||||
AddJsonPackage(spirv-headers)
|
||||
|
||||
# SPIRV Tools
|
||||
AddJsonPackage(spirv-tools)
|
||||
|
||||
if (SPIRV-Tools_ADDED)
|
||||
add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static)
|
||||
target_link_libraries(SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link)
|
||||
endif()
|
||||
|
||||
# mbedtls
|
||||
AddJsonPackage(mbedtls)
|
||||
else()
|
||||
# Enforce the search mode of non-required packages for better and shorter failure messages
|
||||
find_package(fmt 8 REQUIRED)
|
||||
|
@ -467,13 +485,19 @@ else()
|
|||
find_package(Opus 1.3 MODULE REQUIRED)
|
||||
find_package(ZLIB 1.2 REQUIRED)
|
||||
find_package(zstd 1.5 REQUIRED MODULE)
|
||||
find_package(Boost 1.79.0 REQUIRED headers context system fiber)
|
||||
find_package(Boost 1.57.0 REQUIRED context system fiber)
|
||||
find_package(MbedTLS 3)
|
||||
|
||||
find_package(VulkanUtilityLibraries REQUIRED)
|
||||
find_package(VulkanHeaders 1.3.274 REQUIRED)
|
||||
find_package(SPIRV-Tools MODULE REQUIRED)
|
||||
find_package(SPIRV-Headers 1.3.274 REQUIRED)
|
||||
|
||||
if (YUZU_TESTS)
|
||||
find_package(Catch2 3.0.1 REQUIRED)
|
||||
endif()
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID)
|
||||
if (PLATFORM_LINUX OR ANDROID)
|
||||
find_package(gamemode 1.7 MODULE)
|
||||
endif()
|
||||
|
||||
|
@ -594,10 +618,8 @@ endfunction()
|
|||
add_subdirectory(externals)
|
||||
|
||||
# pass targets from externals
|
||||
find_package(VulkanUtilityLibraries)
|
||||
find_package(libusb)
|
||||
find_package(VulkanMemoryAllocator)
|
||||
find_package(SPIRV-Tools)
|
||||
|
||||
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||
find_package(xbyak)
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_search_module(mbedtls QUIET IMPORTED_TARGET mbedtls)
|
||||
find_package_handle_standard_args(mbedtls
|
||||
REQUIRED_VARS mbedtls_LINK_LIBRARIES
|
||||
VERSION_VAR mbedtls_VERSION
|
||||
)
|
||||
|
||||
pkg_search_module(mbedcrypto QUIET IMPORTED_TARGET mbedcrypto)
|
||||
find_package_handle_standard_args(mbedcrypto
|
||||
REQUIRED_VARS mbedcrypto_LINK_LIBRARIES
|
||||
VERSION_VAR mbedcrypto_VERSION
|
||||
)
|
36
cpmfile.json
36
cpmfile.json
|
@ -91,6 +91,42 @@
|
|||
"OPUS_PRESUME_NEON ON"
|
||||
]
|
||||
},
|
||||
"vulkan-utility-headers": {
|
||||
"package": "VulkanUtilityLibraries",
|
||||
"repo": "scripts/VulkanUtilityHeaders",
|
||||
"tag": "1.4.326",
|
||||
"artifact": "VulkanUtilityHeaders.tar.zst",
|
||||
"git_host": "git.crueter.xyz",
|
||||
"hash": "5924629755cb1605c4aa4eee20ef7957a9dd8d61e4df548be656d98054f2730c4109693c1bd35811f401f4705d2ccff9fc849be32b0d8480bc3f73541a5e0964"
|
||||
},
|
||||
"spirv-tools": {
|
||||
"package": "SPIRV-Tools",
|
||||
"repo": "KhronosGroup/SPIRV-Tools",
|
||||
"sha": "40eb301f32",
|
||||
"hash": "58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa",
|
||||
"find_args": "MODULE",
|
||||
"options": [
|
||||
"SPIRV_SKIP_EXECUTABLES ON"
|
||||
]
|
||||
},
|
||||
"spirv-headers": {
|
||||
"package": "SPIRV-Headers",
|
||||
"repo": "KhronosGroup/SPIRV-Headers",
|
||||
"sha": "4e209d3d7e",
|
||||
"hash": "f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4",
|
||||
"options": [
|
||||
"SPIRV_WERROR OFF"
|
||||
]
|
||||
},
|
||||
"mbedtls": {
|
||||
"package": "MbedTLS",
|
||||
"repo": "Mbed-TLS/mbedtls",
|
||||
"tag": "mbedtls-%VERSION%",
|
||||
"hash": "6671fb8fcaa832e5b115dfdce8f78baa6a4aea71f5c89a640583634cdee27aefe3bf4be075744da91f7c3ae5ea4e0c765c8fc3937b5cfd9ea73d87ef496524da",
|
||||
"version": "3",
|
||||
"git_version": "3.6.4",
|
||||
"artifact": "%TAG%.tar.bz2"
|
||||
},
|
||||
"cubeb": {
|
||||
"repo": "mozilla/cubeb",
|
||||
"sha": "fa02160712",
|
||||
|
|
78
externals/CMakeLists.txt
vendored
78
externals/CMakeLists.txt
vendored
|
@ -54,36 +54,27 @@ endif()
|
|||
# Glad
|
||||
add_subdirectory(glad)
|
||||
|
||||
# mbedtls
|
||||
AddJsonPackage(mbedtls)
|
||||
|
||||
if (mbedtls_ADDED)
|
||||
target_include_directories(mbedtls PUBLIC ${mbedtls_SOURCE_DIR}/include)
|
||||
|
||||
if (NOT MSVC)
|
||||
target_compile_options(mbedcrypto PRIVATE
|
||||
-Wno-unused-but-set-variable
|
||||
-Wno-string-concatenation
|
||||
)
|
||||
elseif(CXX_CLANG)
|
||||
foreach(TARGET mbedtls mbedcrypto mbedx509)
|
||||
target_compile_options(${TARGET} PRIVATE
|
||||
-w
|
||||
)
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# libusb
|
||||
if (ENABLE_LIBUSB)
|
||||
add_subdirectory(libusb)
|
||||
endif()
|
||||
|
||||
# Sirit
|
||||
# TODO(crueter): spirv-tools doesn't work w/ system
|
||||
set(SPIRV_WERROR OFF)
|
||||
AddJsonPackage(spirv-headers)
|
||||
# VMA
|
||||
AddJsonPackage(vulkan-memory-allocator)
|
||||
|
||||
if (VulkanMemoryAllocator_ADDED)
|
||||
if (CXX_CLANG)
|
||||
target_compile_options(VulkanMemoryAllocator INTERFACE
|
||||
-Wno-unused-variable
|
||||
)
|
||||
elseif(MSVC)
|
||||
target_compile_options(VulkanMemoryAllocator INTERFACE
|
||||
/wd4189
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Sirit
|
||||
AddJsonPackage(sirit)
|
||||
|
||||
if(MSVC AND USE_CCACHE AND sirit_ADDED)
|
||||
|
@ -117,46 +108,9 @@ if (YUZU_USE_BUNDLED_FFMPEG)
|
|||
set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
# VulkanUtilityHeaders - pulls in headers and utility libs
|
||||
AddJsonPackage(
|
||||
NAME vulkan-utility-headers
|
||||
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES}
|
||||
)
|
||||
|
||||
# small hack
|
||||
if (NOT VulkanUtilityLibraries_ADDED)
|
||||
find_package(VulkanHeaders 1.3.274 REQUIRED)
|
||||
endif()
|
||||
|
||||
# SPIRV Tools
|
||||
AddJsonPackage(
|
||||
NAME spirv-tools
|
||||
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS}
|
||||
)
|
||||
|
||||
if (SPIRV-Tools_ADDED)
|
||||
add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static)
|
||||
target_link_libraries(SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link)
|
||||
endif()
|
||||
|
||||
# TZDB (Time Zone Database)
|
||||
add_subdirectory(nx_tzdb)
|
||||
|
||||
# VMA
|
||||
AddJsonPackage(vulkan-memory-allocator)
|
||||
|
||||
if (VulkanMemoryAllocator_ADDED)
|
||||
if (CXX_CLANG)
|
||||
target_compile_options(VulkanMemoryAllocator INTERFACE
|
||||
-Wno-unused-variable
|
||||
)
|
||||
elseif(MSVC)
|
||||
target_compile_options(VulkanMemoryAllocator INTERFACE
|
||||
/wd4189
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT TARGET LLVM::Demangle)
|
||||
add_library(demangle demangle/ItaniumDemangle.cpp)
|
||||
target_include_directories(demangle PUBLIC ./demangle)
|
||||
|
@ -189,7 +143,7 @@ if (ANDROID AND ARCHITECTURE_arm64)
|
|||
AddJsonPackage(libadrenotools)
|
||||
endif()
|
||||
|
||||
if (UNIX AND NOT APPLE AND NOT TARGET gamemode::headers)
|
||||
if (NOT TARGET gamemode::headers)
|
||||
add_library(gamemode INTERFACE)
|
||||
target_include_directories(gamemode INTERFACE gamemode)
|
||||
add_library(gamemode::headers ALIAS gamemode)
|
||||
|
|
42
externals/cpmfile.json
vendored
42
externals/cpmfile.json
vendored
|
@ -1,15 +1,10 @@
|
|||
{
|
||||
"mbedtls": {
|
||||
"repo": "eden-emulator/mbedtls",
|
||||
"sha": "ce4f81f4a9",
|
||||
"hash": "f2e7f887651b28745e508149214d409fd7cfdb92cb94b4146b47ff1e0fc09e47143f203ac18e34c2c1814b5bd031d04c74828676c0d4342920a2ddb7fd35e9a5",
|
||||
"find_args": "MODULE"
|
||||
},
|
||||
"spirv-headers": {
|
||||
"package": "SPIRV-Headers",
|
||||
"repo": "KhronosGroup/SPIRV-Headers",
|
||||
"sha": "4e209d3d7e",
|
||||
"hash": "f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4"
|
||||
"vulkan-memory-allocator": {
|
||||
"package": "VulkanMemoryAllocator",
|
||||
"repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator",
|
||||
"sha": "1076b348ab",
|
||||
"hash": "a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772",
|
||||
"find_args": "CONFIG"
|
||||
},
|
||||
"sirit": {
|
||||
"repo": "eden-emulator/sirit",
|
||||
|
@ -35,31 +30,6 @@
|
|||
"CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
|
||||
]
|
||||
},
|
||||
"vulkan-utility-headers": {
|
||||
"package": "VulkanUtilityLibraries",
|
||||
"repo": "scripts/VulkanUtilityHeaders",
|
||||
"tag": "1.4.326",
|
||||
"artifact": "VulkanUtilityHeaders.tar.zst",
|
||||
"git_host": "git.crueter.xyz",
|
||||
"hash": "5924629755cb1605c4aa4eee20ef7957a9dd8d61e4df548be656d98054f2730c4109693c1bd35811f401f4705d2ccff9fc849be32b0d8480bc3f73541a5e0964"
|
||||
},
|
||||
"vulkan-memory-allocator": {
|
||||
"package": "VulkanMemoryAllocator",
|
||||
"repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator",
|
||||
"sha": "1076b348ab",
|
||||
"hash": "a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772",
|
||||
"find_args": "CONFIG"
|
||||
},
|
||||
"spirv-tools": {
|
||||
"package": "SPIRV-Tools",
|
||||
"repo": "KhronosGroup/SPIRV-Tools",
|
||||
"sha": "40eb301f32",
|
||||
"hash": "58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa",
|
||||
"find_args": "MODULE",
|
||||
"options": [
|
||||
"SPIRV_SKIP_EXECUTABLES ON"
|
||||
]
|
||||
},
|
||||
"xbyak_sun": {
|
||||
"package": "xbyak",
|
||||
"repo": "herumi/xbyak",
|
||||
|
|
28
externals/gamemode/gamemode_client.h
vendored
28
externals/gamemode/gamemode_client.h
vendored
|
@ -1,6 +1,9 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
/*
|
||||
|
||||
Copyright (c) 2017-2019, Feral Interactive
|
||||
Copyright (c) 2017-2025, Feral Interactive and the GameMode contributors
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
@ -103,6 +106,7 @@ typedef int (*api_call_pid_return_int)(pid_t);
|
|||
static api_call_return_int REAL_internal_gamemode_request_start = NULL;
|
||||
static api_call_return_int REAL_internal_gamemode_request_end = NULL;
|
||||
static api_call_return_int REAL_internal_gamemode_query_status = NULL;
|
||||
static api_call_return_int REAL_internal_gamemode_request_restart = NULL;
|
||||
static api_call_return_cstring REAL_internal_gamemode_error_string = NULL;
|
||||
static api_call_pid_return_int REAL_internal_gamemode_request_start_for = NULL;
|
||||
static api_call_pid_return_int REAL_internal_gamemode_request_end_for = NULL;
|
||||
|
@ -166,6 +170,10 @@ __attribute__((always_inline)) static inline int internal_load_libgamemode(void)
|
|||
(void **)&REAL_internal_gamemode_query_status,
|
||||
sizeof(REAL_internal_gamemode_query_status),
|
||||
false },
|
||||
{ "real_gamemode_request_restart",
|
||||
(void **)&REAL_internal_gamemode_request_restart,
|
||||
sizeof(REAL_internal_gamemode_request_restart),
|
||||
false },
|
||||
{ "real_gamemode_error_string",
|
||||
(void **)&REAL_internal_gamemode_error_string,
|
||||
sizeof(REAL_internal_gamemode_error_string),
|
||||
|
@ -319,6 +327,24 @@ __attribute__((always_inline)) static inline int gamemode_query_status(void)
|
|||
return REAL_internal_gamemode_query_status();
|
||||
}
|
||||
|
||||
/* Redirect to the real libgamemode */
|
||||
__attribute__((always_inline)) static inline int gamemode_request_restart(void)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_request_restart == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
sizeof(internal_gamemode_client_error_string),
|
||||
"gamemode_request_restart missing (older host?)");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return REAL_internal_gamemode_request_restart();
|
||||
}
|
||||
|
||||
/* Redirect to the real libgamemode */
|
||||
__attribute__((always_inline)) static inline int gamemode_request_start_for(pid_t pid)
|
||||
{
|
||||
|
|
12
externals/libusb/CMakeLists.txt
vendored
12
externals/libusb/CMakeLists.txt
vendored
|
@ -3,7 +3,17 @@
|
|||
|
||||
include(CPMUtil)
|
||||
|
||||
AddJsonPackage(libusb)
|
||||
if (PLATFORM_SUN OR PLATFORM_OPENBSD OR PLATFORM_FREEBSD)
|
||||
set(libusb_bundled ON)
|
||||
else()
|
||||
set(libusb_bundled OFF)
|
||||
endif()
|
||||
|
||||
# TODO(crueter): Fix on *BSD/Solaris
|
||||
AddJsonPackage(
|
||||
NAME libusb
|
||||
BUNDLED_PACKAGE ${libusb_bundled}
|
||||
)
|
||||
|
||||
if (NOT libusb_ADDED)
|
||||
return()
|
||||
|
|
|
@ -36,17 +36,18 @@ import androidx.core.net.toUri
|
|||
import androidx.core.content.edit
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import org.yuzu.yuzu_emu.NativeLibrary
|
||||
import org.yuzu.yuzu_emu.databinding.CardGameGridCompactBinding
|
||||
import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
|
||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
||||
import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||
|
||||
class GameAdapter(private val activity: AppCompatActivity) :
|
||||
AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>(exact = false) {
|
||||
|
||||
companion object {
|
||||
const val VIEW_TYPE_GRID = 0
|
||||
const val VIEW_TYPE_LIST = 1
|
||||
const val VIEW_TYPE_CAROUSEL = 2
|
||||
const val VIEW_TYPE_GRID_COMPACT = 1
|
||||
const val VIEW_TYPE_LIST = 2
|
||||
const val VIEW_TYPE_CAROUSEL = 3
|
||||
}
|
||||
|
||||
private var viewType = 0
|
||||
|
@ -80,6 +81,7 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
|||
listBinding.root.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||
listBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
}
|
||||
|
||||
VIEW_TYPE_GRID -> {
|
||||
val gridBinding = holder.binding as CardGameGridBinding
|
||||
gridBinding.cardGameGrid.scaleX = 1f
|
||||
|
@ -89,6 +91,17 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
|||
gridBinding.root.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||
gridBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
}
|
||||
|
||||
VIEW_TYPE_GRID_COMPACT -> {
|
||||
val gridCompactBinding = holder.binding as CardGameGridCompactBinding
|
||||
gridCompactBinding.cardGameGridCompact.scaleX = 1f
|
||||
gridCompactBinding.cardGameGridCompact.scaleY = 1f
|
||||
gridCompactBinding.cardGameGridCompact.alpha = 1f
|
||||
// Reset layout params to XML defaults (same as normal grid)
|
||||
gridCompactBinding.root.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||
gridCompactBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
}
|
||||
|
||||
VIEW_TYPE_CAROUSEL -> {
|
||||
val carouselBinding = holder.binding as CardGameCarouselBinding
|
||||
// soothens transient flickering
|
||||
|
@ -105,16 +118,25 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
|||
parent,
|
||||
false
|
||||
)
|
||||
|
||||
VIEW_TYPE_GRID -> CardGameGridBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
false
|
||||
)
|
||||
|
||||
VIEW_TYPE_GRID_COMPACT -> CardGameGridCompactBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
false
|
||||
)
|
||||
|
||||
VIEW_TYPE_CAROUSEL -> CardGameCarouselBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
false
|
||||
)
|
||||
|
||||
else -> throw IllegalArgumentException("Invalid view type")
|
||||
}
|
||||
return GameViewHolder(binding, viewType)
|
||||
|
@ -130,6 +152,7 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
|||
VIEW_TYPE_LIST -> bindListView(model)
|
||||
VIEW_TYPE_GRID -> bindGridView(model)
|
||||
VIEW_TYPE_CAROUSEL -> bindCarouselView(model)
|
||||
VIEW_TYPE_GRID_COMPACT -> bindGridCompactView(model)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -168,6 +191,23 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
|||
gridBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
}
|
||||
|
||||
private fun bindGridCompactView(model: Game) {
|
||||
val gridCompactBinding = binding as CardGameGridCompactBinding
|
||||
|
||||
gridCompactBinding.imageGameScreenCompact.scaleType = ImageView.ScaleType.CENTER_CROP
|
||||
GameIconUtils.loadGameIcon(model, gridCompactBinding.imageGameScreenCompact)
|
||||
|
||||
gridCompactBinding.textGameTitleCompact.text = model.title.replace("[\\t\\n\\r]+".toRegex(), " ")
|
||||
|
||||
gridCompactBinding.textGameTitleCompact.marquee()
|
||||
gridCompactBinding.cardGameGridCompact.setOnClickListener { onClick(model) }
|
||||
gridCompactBinding.cardGameGridCompact.setOnLongClickListener { onLongClick(model) }
|
||||
|
||||
// Reset layout params to XML defaults (same as normal grid)
|
||||
gridCompactBinding.root.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||
gridCompactBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
}
|
||||
|
||||
private fun bindCarouselView(model: Game) {
|
||||
val carouselBinding = binding as CardGameCarouselBinding
|
||||
|
||||
|
|
|
@ -194,6 +194,10 @@ class GamesFragment : Fragment() {
|
|||
val columns = resources.getInteger(R.integer.game_columns_grid)
|
||||
GridLayoutManager(context, columns)
|
||||
}
|
||||
GameAdapter.VIEW_TYPE_GRID_COMPACT -> {
|
||||
val columns = resources.getInteger(R.integer.game_columns_grid)
|
||||
GridLayoutManager(context, columns)
|
||||
}
|
||||
GameAdapter.VIEW_TYPE_LIST -> {
|
||||
val columns = resources.getInteger(R.integer.game_columns_list)
|
||||
GridLayoutManager(context, columns)
|
||||
|
@ -300,6 +304,7 @@ class GamesFragment : Fragment() {
|
|||
val currentViewType = getCurrentViewType()
|
||||
when (currentViewType) {
|
||||
GameAdapter.VIEW_TYPE_LIST -> popup.menu.findItem(R.id.view_list).isChecked = true
|
||||
GameAdapter.VIEW_TYPE_GRID_COMPACT -> popup.menu.findItem(R.id.view_grid_compact).isChecked = true
|
||||
GameAdapter.VIEW_TYPE_GRID -> popup.menu.findItem(R.id.view_grid).isChecked = true
|
||||
GameAdapter.VIEW_TYPE_CAROUSEL -> popup.menu.findItem(R.id.view_carousel).isChecked = true
|
||||
}
|
||||
|
@ -314,6 +319,14 @@ class GamesFragment : Fragment() {
|
|||
true
|
||||
}
|
||||
|
||||
R.id.view_grid_compact -> {
|
||||
if (getCurrentViewType() == GameAdapter.VIEW_TYPE_CAROUSEL) onPause()
|
||||
setCurrentViewType(GameAdapter.VIEW_TYPE_GRID_COMPACT)
|
||||
applyGridGamesBinding()
|
||||
item.isChecked = true
|
||||
true
|
||||
}
|
||||
|
||||
R.id.view_list -> {
|
||||
if (getCurrentViewType() == GameAdapter.VIEW_TYPE_CAROUSEL) onPause()
|
||||
setCurrentViewType(GameAdapter.VIEW_TYPE_LIST)
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<gradient
|
||||
android:angle="270"
|
||||
android:startColor="@android:color/transparent"
|
||||
android:centerColor="#66000000"
|
||||
android:endColor="#AA000000"
|
||||
android:type="linear" />
|
||||
</shape>
|
|
@ -5,27 +5,32 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:focusable="false"
|
||||
android:focusableInTouchMode="false">
|
||||
android:focusableInTouchMode="false"
|
||||
android:padding="4dp">
|
||||
|
||||
<org.yuzu.yuzu_emu.views.GradientBorderCardView
|
||||
android:id="@+id/card_game_grid"
|
||||
app:cardElevation="0dp"
|
||||
app:cardBackgroundColor="@color/eden_card_background"
|
||||
app:strokeWidth="1dp"
|
||||
app:strokeColor="@color/eden_border"
|
||||
app:strokeWidth="0dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_margin="4dp"
|
||||
android:clickable="true"
|
||||
android:clipToPadding="true"
|
||||
android:focusable="true"
|
||||
android:transitionName="card_game"
|
||||
app:cardCornerRadius="16dp">
|
||||
app:cardCornerRadius="16dp"
|
||||
android:foreground="@color/eden_border_gradient_start">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="6dp">
|
||||
android:paddingTop="14dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:paddingBottom="6dp">
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/image_game_screen"
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:focusable="false"
|
||||
android:focusableInTouchMode="false"
|
||||
android:padding="4dp">
|
||||
|
||||
<org.yuzu.yuzu_emu.views.GradientBorderCardView
|
||||
android:id="@+id/card_game_grid_compact"
|
||||
app:cardElevation="0dp"
|
||||
app:cardBackgroundColor="@color/eden_card_background"
|
||||
app:strokeWidth="0dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_margin="4dp"
|
||||
android:clickable="true"
|
||||
android:clipToPadding="true"
|
||||
android:focusable="true"
|
||||
android:transitionName="card_game_compact"
|
||||
app:cardCornerRadius="16dp"
|
||||
android:foreground="@color/eden_border_gradient_start">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="14dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:paddingBottom="6dp">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/image_container"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="100dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/image_game_screen_compact"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Medium"
|
||||
android:scaleType="centerCrop"
|
||||
tools:src="@drawable/default_icon" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/gradient_overlay_bottom" />
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/text_game_title_compact"
|
||||
style="@style/SynthwaveText.Body"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_margin="6dp"
|
||||
android:requiresFadingEdge="horizontal"
|
||||
android:textAlignment="center"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
android:textColor="@android:color/white"
|
||||
android:shadowColor="@android:color/black"
|
||||
android:shadowDx="1"
|
||||
android:shadowDy="1"
|
||||
android:shadowRadius="2"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
tools:text="The Legend of Zelda: Skyward Sword" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</org.yuzu.yuzu_emu.views.GradientBorderCardView>
|
||||
|
||||
</FrameLayout>
|
|
@ -4,6 +4,9 @@
|
|||
<item
|
||||
android:id="@+id/view_grid"
|
||||
android:title="@string/view_grid"/>
|
||||
<item
|
||||
android:id="@+id/view_grid_compact"
|
||||
android:title="@string/view_grid_compact"/>
|
||||
<item
|
||||
android:id="@+id/view_list"
|
||||
android:title="@string/view_list"
|
||||
|
|
|
@ -266,6 +266,7 @@
|
|||
<string name="alphabetical">Alphabetical</string>
|
||||
<string name="view_list">List</string>
|
||||
<string name="view_grid">Grid</string>
|
||||
<string name="view_grid_compact">Compact Grid</string>
|
||||
<string name="view_carousel">Carousel</string>
|
||||
<string name="game_image_desc">Screenshot for %1$s</string>
|
||||
<string name="folder">Folder</string>
|
||||
|
|
|
@ -69,6 +69,8 @@ add_library(
|
|||
fs/fs_util.h
|
||||
fs/path_util.cpp
|
||||
fs/path_util.h
|
||||
gamemode.cpp
|
||||
gamemode.h
|
||||
hash.h
|
||||
heap_tracker.cpp
|
||||
heap_tracker.h
|
||||
|
@ -187,11 +189,7 @@ if(ANDROID)
|
|||
android/applets/software_keyboard.h)
|
||||
endif()
|
||||
|
||||
if(LINUX AND NOT APPLE)
|
||||
target_sources(common PRIVATE linux/gamemode.cpp linux/gamemode.h)
|
||||
|
||||
target_link_libraries(common PRIVATE gamemode::headers)
|
||||
endif()
|
||||
target_link_libraries(common PRIVATE gamemode::headers)
|
||||
|
||||
if(ARCHITECTURE_x86_64)
|
||||
target_sources(
|
||||
|
|
50
src/common/gamemode.cpp
Normal file
50
src/common/gamemode.cpp
Normal file
|
@ -0,0 +1,50 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// While technically available on al *NIX platforms, Linux is only available
|
||||
// as the primary target of libgamemode.so - so warnings are suppressed
|
||||
#ifdef __unix__
|
||||
#include <gamemode_client.h>
|
||||
#endif
|
||||
#include "common/gamemode.h"
|
||||
#include "common/logging/log.h"
|
||||
#include "common/settings.h"
|
||||
|
||||
namespace Common::FeralGamemode {
|
||||
|
||||
void Start() noexcept {
|
||||
if (Settings::values.enable_gamemode) {
|
||||
#ifdef __unix__
|
||||
if (gamemode_request_start() < 0) {
|
||||
#ifdef __linux__
|
||||
LOG_WARNING(Frontend, "{}", gamemode_error_string());
|
||||
#else
|
||||
LOG_INFO(Frontend, "{}", gamemode_error_string());
|
||||
#endif
|
||||
} else {
|
||||
LOG_INFO(Frontend, "Done");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void Stop() noexcept {
|
||||
if (Settings::values.enable_gamemode) {
|
||||
#ifdef __unix__
|
||||
if (gamemode_request_end() < 0) {
|
||||
#ifdef __linux__
|
||||
LOG_WARNING(Frontend, "{}", gamemode_error_string());
|
||||
#else
|
||||
LOG_INFO(Frontend, "{}", gamemode_error_string());
|
||||
#endif
|
||||
} else {
|
||||
LOG_INFO(Frontend, "Done");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Common::Linux
|
17
src/common/gamemode.h
Normal file
17
src/common/gamemode.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace Common::FeralGamemode {
|
||||
|
||||
/// @brief Start the gamemode client
|
||||
void Start() noexcept;
|
||||
|
||||
/// @brief Stop the gmemode client
|
||||
void Stop() noexcept;
|
||||
|
||||
} // namespace Common::FeralGamemode
|
|
@ -1,40 +0,0 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <gamemode_client.h>
|
||||
|
||||
#include "common/linux/gamemode.h"
|
||||
#include "common/logging/log.h"
|
||||
#include "common/settings.h"
|
||||
|
||||
namespace Common::Linux {
|
||||
|
||||
void StartGamemode() {
|
||||
if (Settings::values.enable_gamemode) {
|
||||
if (gamemode_request_start() < 0) {
|
||||
LOG_WARNING(Frontend, "Failed to start gamemode: {}", gamemode_error_string());
|
||||
} else {
|
||||
LOG_INFO(Frontend, "Started gamemode");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StopGamemode() {
|
||||
if (Settings::values.enable_gamemode) {
|
||||
if (gamemode_request_end() < 0) {
|
||||
LOG_WARNING(Frontend, "Failed to stop gamemode: {}", gamemode_error_string());
|
||||
} else {
|
||||
LOG_INFO(Frontend, "Stopped gamemode");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetGamemodeState(bool state) {
|
||||
if (state) {
|
||||
StartGamemode();
|
||||
} else {
|
||||
StopGamemode();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Common::Linux
|
|
@ -1,24 +0,0 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace Common::Linux {
|
||||
|
||||
/**
|
||||
* Start the (Feral Interactive) Linux gamemode if it is installed and it is activated
|
||||
*/
|
||||
void StartGamemode();
|
||||
|
||||
/**
|
||||
* Stop the (Feral Interactive) Linux gamemode if it is installed and it is activated
|
||||
*/
|
||||
void StopGamemode();
|
||||
|
||||
/**
|
||||
* Start or stop the (Feral Interactive) Linux gamemode if it is installed and it is activated
|
||||
* @param state The new state the gamemode should have
|
||||
*/
|
||||
void SetGamemodeState(bool state);
|
||||
|
||||
} // namespace Common::Linux
|
|
@ -645,8 +645,14 @@ struct Values {
|
|||
true,
|
||||
true};
|
||||
|
||||
// Linux
|
||||
SwitchableSetting<bool> enable_gamemode{linkage, true, "enable_gamemode", Category::Linux};
|
||||
// Linux/MinGW may support (requires libdl support)
|
||||
SwitchableSetting<bool> enable_gamemode{linkage,
|
||||
#ifndef _MSC_VER
|
||||
true,
|
||||
#else
|
||||
false,
|
||||
#endif
|
||||
"enable_gamemode", Category::UiGeneral};
|
||||
|
||||
// Controls
|
||||
InputSetting<std::array<PlayerInput, 10>> players;
|
||||
|
|
|
@ -44,7 +44,6 @@ enum class Category : u32 {
|
|||
Multiplayer,
|
||||
Services,
|
||||
Paths,
|
||||
Linux,
|
||||
LibraryApplet,
|
||||
MaxEnum,
|
||||
};
|
||||
|
|
|
@ -1200,7 +1200,7 @@ else()
|
|||
target_link_libraries(core PUBLIC Boost::headers)
|
||||
endif()
|
||||
|
||||
target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json RenderDoc::API mbedtls mbedcrypto)
|
||||
target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json RenderDoc::API MbedTLS::mbedcrypto MbedTLS::mbedtls)
|
||||
if (MINGW)
|
||||
target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY})
|
||||
endif()
|
||||
|
|
|
@ -16,7 +16,7 @@ struct CipherContext;
|
|||
enum class Mode {
|
||||
CTR = 11,
|
||||
ECB = 2,
|
||||
XTS = 70,
|
||||
XTS = 74,
|
||||
};
|
||||
|
||||
enum class Op {
|
||||
|
|
|
@ -539,7 +539,7 @@ static std::array<u8, target_size> MGF1(const std::array<u8, in_size>& seed) {
|
|||
while (out.size() < target_size) {
|
||||
out.resize(out.size() + 0x20);
|
||||
seed_exp[in_size + 3] = static_cast<u8>(i);
|
||||
mbedtls_sha256_ret(seed_exp.data(), seed_exp.size(), out.data() + out.size() - 0x20, 0);
|
||||
mbedtls_sha256(seed_exp.data(), seed_exp.size(), out.data() + out.size() - 0x20, 0);
|
||||
++i;
|
||||
}
|
||||
|
||||
|
|
|
@ -178,7 +178,7 @@ std::array<u8, key_size> FindKeyFromHex(const std::vector<u8>& binary,
|
|||
|
||||
std::array<u8, 0x20> temp{};
|
||||
for (size_t i = 0; i < binary.size() - key_size; ++i) {
|
||||
mbedtls_sha256_ret(binary.data() + i, key_size, temp.data(), 0);
|
||||
mbedtls_sha256(binary.data() + i, key_size, temp.data(), 0);
|
||||
|
||||
if (temp != hash)
|
||||
continue;
|
||||
|
@ -206,7 +206,7 @@ static std::array<Key128, 0x20> FindEncryptedMasterKeyFromHex(const std::vector<
|
|||
AESCipher<Key128> cipher(key, Mode::ECB);
|
||||
for (size_t i = 0; i < binary.size() - 0x10; ++i) {
|
||||
cipher.Transcode(binary.data() + i, dec_temp.size(), dec_temp.data(), Op::Decrypt);
|
||||
mbedtls_sha256_ret(dec_temp.data(), dec_temp.size(), temp.data(), 0);
|
||||
mbedtls_sha256(dec_temp.data(), dec_temp.size(), temp.data(), 0);
|
||||
|
||||
for (size_t k = 0; k < out.size(); ++k) {
|
||||
if (temp == master_key_hashes[k]) {
|
||||
|
|
|
@ -64,7 +64,7 @@ static std::string GetRelativePathFromNcaID(const std::array<u8, 16>& nca_id, bo
|
|||
}
|
||||
|
||||
Core::Crypto::SHA256Hash hash{};
|
||||
mbedtls_sha256_ret(nca_id.data(), nca_id.size(), hash.data(), 0);
|
||||
mbedtls_sha256(nca_id.data(), nca_id.size(), hash.data(), 0);
|
||||
|
||||
const auto format_str =
|
||||
fmt::runtime(cnmt_suffix ? "/000000{:02X}/{}.cnmt.nca" : "/000000{:02X}/{}.nca");
|
||||
|
@ -146,7 +146,7 @@ bool PlaceholderCache::Create(const NcaID& id, u64 size) const {
|
|||
}
|
||||
|
||||
Core::Crypto::SHA256Hash hash{};
|
||||
mbedtls_sha256_ret(id.data(), id.size(), hash.data(), 0);
|
||||
mbedtls_sha256(id.data(), id.size(), hash.data(), 0);
|
||||
const auto dirname = fmt::format("000000{:02X}", hash[0]);
|
||||
|
||||
const auto dir2 = GetOrCreateDirectoryRelative(dir, dirname);
|
||||
|
@ -170,7 +170,7 @@ bool PlaceholderCache::Delete(const NcaID& id) const {
|
|||
}
|
||||
|
||||
Core::Crypto::SHA256Hash hash{};
|
||||
mbedtls_sha256_ret(id.data(), id.size(), hash.data(), 0);
|
||||
mbedtls_sha256(id.data(), id.size(), hash.data(), 0);
|
||||
const auto dirname = fmt::format("000000{:02X}", hash[0]);
|
||||
|
||||
const auto dir2 = GetOrCreateDirectoryRelative(dir, dirname);
|
||||
|
@ -665,7 +665,7 @@ InstallResult RegisteredCache::InstallEntry(const NCA& nca, TitleType type,
|
|||
const OptionalHeader opt_header{0, 0};
|
||||
ContentRecord c_rec{{}, {}, {}, GetCRTypeFromNCAType(nca.GetType()), {}};
|
||||
const auto& data = nca.GetBaseFile()->ReadBytes(0x100000);
|
||||
mbedtls_sha256_ret(data.data(), data.size(), c_rec.hash.data(), 0);
|
||||
mbedtls_sha256(data.data(), data.size(), c_rec.hash.data(), 0);
|
||||
std::memcpy(&c_rec.nca_id, &c_rec.hash, 16);
|
||||
const CNMT new_cnmt(header, opt_header, {c_rec}, {});
|
||||
if (!RawInstallYuzuMeta(new_cnmt)) {
|
||||
|
@ -776,7 +776,7 @@ InstallResult RegisteredCache::RawInstallNCA(const NCA& nca, const VfsCopyFuncti
|
|||
id = *override_id;
|
||||
} else {
|
||||
const auto& data = in->ReadBytes(0x100000);
|
||||
mbedtls_sha256_ret(data.data(), data.size(), hash.data(), 0);
|
||||
mbedtls_sha256(data.data(), data.size(), hash.data(), 0);
|
||||
memcpy(id.data(), hash.data(), 16);
|
||||
}
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ NAX::NAX(VirtualFile file_, std::array<u8, 0x10> nca_id)
|
|||
: header(std::make_unique<NAXHeader>()),
|
||||
file(std::move(file_)), keys{Core::Crypto::KeyManager::Instance()} {
|
||||
Core::Crypto::SHA256Hash hash{};
|
||||
mbedtls_sha256_ret(nca_id.data(), nca_id.size(), hash.data(), 0);
|
||||
mbedtls_sha256(nca_id.data(), nca_id.size(), hash.data(), 0);
|
||||
status = Parse(fmt::format("/registered/000000{:02X}/{}.nca", hash[0],
|
||||
Common::HexToString(nca_id, false)));
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ namespace Service::BCAT {
|
|||
static BcatDigest DigestFile(const FileSys::VirtualFile& file) {
|
||||
BcatDigest out{};
|
||||
const auto bytes = file->ReadAllBytes();
|
||||
mbedtls_md5_ret(bytes.data(), bytes.size(), out.data());
|
||||
mbedtls_md5(bytes.data(), bytes.size(), out.data());
|
||||
return out;
|
||||
}
|
||||
|
||||
|
|
|
@ -178,7 +178,7 @@ struct ProcessContext {
|
|||
std::vector<u8> nro_data(size);
|
||||
m_process->GetMemory().ReadBlock(base_address, nro_data.data(), size);
|
||||
|
||||
mbedtls_sha256_ret(nro_data.data(), size, hash.data(), 0);
|
||||
mbedtls_sha256(nro_data.data(), size, hash.data(), 0);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < MaxNrrInfos; i++) {
|
||||
|
|
|
@ -150,7 +150,7 @@ ResultStatus AppLoader_NCA::VerifyIntegrity(std::function<bool(size_t, size_t)>
|
|||
// Initialize sha256 verification context.
|
||||
mbedtls_sha256_context ctx;
|
||||
mbedtls_sha256_init(&ctx);
|
||||
mbedtls_sha256_starts_ret(&ctx, 0);
|
||||
mbedtls_sha256_starts(&ctx, 0);
|
||||
|
||||
// Ensure we maintain a clean state on exit.
|
||||
SCOPE_EXIT {
|
||||
|
@ -168,7 +168,7 @@ ResultStatus AppLoader_NCA::VerifyIntegrity(std::function<bool(size_t, size_t)>
|
|||
const size_t read_size = file->Read(buffer.data(), intended_read_size, processed_size);
|
||||
|
||||
// Update the hash function with the buffer contents.
|
||||
mbedtls_sha256_update_ret(&ctx, buffer.data(), read_size);
|
||||
mbedtls_sha256_update(&ctx, buffer.data(), read_size);
|
||||
|
||||
// Update counters.
|
||||
processed_size += read_size;
|
||||
|
@ -181,7 +181,7 @@ ResultStatus AppLoader_NCA::VerifyIntegrity(std::function<bool(size_t, size_t)>
|
|||
|
||||
// Finalize context and compute the output hash.
|
||||
std::array<u8, NcaSha256HashLength> output_hash;
|
||||
mbedtls_sha256_finish_ret(&ctx, output_hash.data());
|
||||
mbedtls_sha256_finish(&ctx, output_hash.data());
|
||||
|
||||
// Compare to expected.
|
||||
if (std::memcmp(input_hash.data(), output_hash.data(), NcaSha256HalfHashLength) != 0) {
|
||||
|
|
|
@ -20,7 +20,7 @@ if (ENABLE_WEB_SERVICE)
|
|||
target_link_libraries(yuzu-room PRIVATE web_service)
|
||||
endif()
|
||||
|
||||
target_link_libraries(yuzu-room PRIVATE mbedtls mbedcrypto)
|
||||
target_link_libraries(yuzu-room PRIVATE MbedTLS::mbedcrypto MbedTLS::mbedtls)
|
||||
if (MSVC)
|
||||
target_link_libraries(yuzu-room PRIVATE getopt)
|
||||
endif()
|
||||
|
|
|
@ -460,7 +460,10 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QWidget* parent)
|
|||
tr("Whether or not to check for updates upon startup."));
|
||||
|
||||
// Linux
|
||||
INSERT(Settings, enable_gamemode, tr("Enable Gamemode"), QString());
|
||||
INSERT(UISettings,
|
||||
enable_gamemode,
|
||||
tr("Enable Gamemode"),
|
||||
QString());
|
||||
|
||||
// Ui Debugging
|
||||
|
||||
|
|
|
@ -21,9 +21,7 @@
|
|||
#include <csignal>
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef __linux__
|
||||
#include "common/linux/gamemode.h"
|
||||
#endif
|
||||
#include "common/gamemode.h"
|
||||
|
||||
#include <boost/container/flat_set.hpp>
|
||||
|
||||
|
@ -430,10 +428,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan)
|
|||
#ifdef __unix__
|
||||
SetupSigInterrupts();
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
SetGamemodeEnabled(Settings::values.enable_gamemode.GetValue());
|
||||
#endif
|
||||
|
||||
UISettings::RestoreWindowState(config);
|
||||
|
||||
|
@ -2393,9 +2388,7 @@ void GMainWindow::OnEmulationStopped() {
|
|||
|
||||
discord_rpc->Update();
|
||||
|
||||
#ifdef __linux__
|
||||
Common::Linux::StopGamemode();
|
||||
#endif
|
||||
Common::FeralGamemode::Stop();
|
||||
|
||||
// The emulation is stopped, so closing the window or not does not matter anymore
|
||||
disconnect(render_window, &GRenderWindow::Closed, this, &GMainWindow::OnStopGame);
|
||||
|
@ -3578,10 +3571,7 @@ void GMainWindow::OnStartGame() {
|
|||
play_time_manager->Start();
|
||||
|
||||
discord_rpc->Update();
|
||||
|
||||
#ifdef __linux__
|
||||
Common::Linux::StartGamemode();
|
||||
#endif
|
||||
Common::FeralGamemode::Start();
|
||||
}
|
||||
|
||||
void GMainWindow::OnRestartGame() {
|
||||
|
@ -3602,10 +3592,7 @@ void GMainWindow::OnPauseGame() {
|
|||
play_time_manager->Stop();
|
||||
UpdateMenuState();
|
||||
AllowOSSleep();
|
||||
|
||||
#ifdef __linux__
|
||||
Common::Linux::StopGamemode();
|
||||
#endif
|
||||
Common::FeralGamemode::Stop();
|
||||
}
|
||||
|
||||
void GMainWindow::OnPauseContinueGame() {
|
||||
|
@ -3900,9 +3887,7 @@ void GMainWindow::OnConfigure() {
|
|||
const auto old_theme = UISettings::values.theme;
|
||||
const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue();
|
||||
const auto old_language_index = Settings::values.language_index.GetValue();
|
||||
#ifdef __linux__
|
||||
const bool old_gamemode = Settings::values.enable_gamemode.GetValue();
|
||||
#endif
|
||||
|
||||
Settings::SetConfiguringGlobal(true);
|
||||
ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(),
|
||||
|
@ -3962,11 +3947,9 @@ void GMainWindow::OnConfigure() {
|
|||
if (UISettings::values.enable_discord_presence.GetValue() != old_discord_presence) {
|
||||
SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue());
|
||||
}
|
||||
#ifdef __linux__
|
||||
if (Settings::values.enable_gamemode.GetValue() != old_gamemode) {
|
||||
SetGamemodeEnabled(Settings::values.enable_gamemode.GetValue());
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!multiplayer_state->IsHostingPublicRoom()) {
|
||||
multiplayer_state->UpdateCredentials();
|
||||
|
@ -5626,13 +5609,15 @@ void GMainWindow::SetDiscordEnabled([[maybe_unused]] bool state) {
|
|||
discord_rpc->Update();
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
void GMainWindow::SetGamemodeEnabled(bool state) {
|
||||
if (emulation_running) {
|
||||
Common::Linux::SetGamemodeState(state);
|
||||
if (state) {
|
||||
Common::FeralGamemode::Start();
|
||||
} else {
|
||||
Common::FeralGamemode::Stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void GMainWindow::changeEvent(QEvent* event) {
|
||||
#ifdef __unix__
|
||||
|
@ -5792,7 +5777,9 @@ int main(int argc, char* argv[]) {
|
|||
// the user folder in the Qt Frontend, we need to cd into that working directory
|
||||
const auto bin_path = Common::FS::GetBundleDirectory() / "..";
|
||||
chdir(Common::FS::PathToUTF8String(bin_path).c_str());
|
||||
#elif defined(__unix__) && !defined(__ANDROID__)
|
||||
#endif
|
||||
|
||||
#ifdef __unix__
|
||||
// Set the DISPLAY variable in order to open web browsers
|
||||
// TODO (lat9nq): Find a better solution for AppImages to start external applications
|
||||
if (QString::fromLocal8Bit(qgetenv("DISPLAY")).isEmpty()) {
|
||||
|
|
|
@ -327,8 +327,8 @@ private:
|
|||
void SetupSigInterrupts();
|
||||
static void HandleSigInterrupt(int);
|
||||
void OnSigInterruptNotifierActivated();
|
||||
void SetGamemodeEnabled(bool state);
|
||||
#endif
|
||||
void SetGamemodeEnabled(bool state);
|
||||
|
||||
Service::AM::FrontendAppletParameters ApplicationAppletParameters();
|
||||
Service::AM::FrontendAppletParameters LibraryAppletParameters(u64 program_id,
|
||||
|
|
|
@ -63,10 +63,7 @@ __declspec(dllexport) unsigned long NvOptimusEnablement = 0x00000001;
|
|||
__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
#include "common/linux/gamemode.h"
|
||||
#endif
|
||||
#include "common/gamemode.h"
|
||||
|
||||
static void PrintHelp(const char* argv0) {
|
||||
std::cout << "Usage: " << argv0
|
||||
|
@ -435,10 +432,7 @@ int main(int argc, char** argv) {
|
|||
// Just exit right away.
|
||||
exit(0);
|
||||
});
|
||||
|
||||
#ifdef __linux__
|
||||
Common::Linux::StartGamemode();
|
||||
#endif
|
||||
Common::FeralGamemode::Start();
|
||||
|
||||
void(system.Run());
|
||||
if (system.DebuggerEnabled()) {
|
||||
|
@ -450,11 +444,7 @@ int main(int argc, char** argv) {
|
|||
system.DetachDebugger();
|
||||
void(system.Pause());
|
||||
system.ShutdownMainProcess();
|
||||
|
||||
#ifdef __linux__
|
||||
Common::Linux::StopGamemode();
|
||||
#endif
|
||||
|
||||
Common::FeralGamemode::Stop();
|
||||
detached_tasks.WaitForAllTasks();
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue