Compare commits
27 commits
6d7820cf01
...
33a203159b
Author | SHA1 | Date | |
---|---|---|---|
33a203159b | |||
83e9f7b441 | |||
b91704c824 | |||
8ccc4192eb | |||
8169b09749 | |||
c6c3bff022 | |||
a2614a9241 | |||
a4b288a689 | |||
07d00fba16 | |||
8fb655a242 | |||
be4d1f7358 | |||
d3fcee21d0 | |||
7a12441d25 | |||
e18628eb6c | |||
4c02ca7a5f | |||
fe362c9e00 | |||
caaef71d9d | |||
0d28d07b77 | |||
6c5d6ac237 | |||
b2967171ea | |||
edadf5e8c8 | |||
efa3a44ac1 | |||
6f2d1d8eab | |||
2e61d8618e | |||
d2541dde75 | |||
4c5d03f5de | |||
d207df959a |
23 changed files with 275 additions and 147 deletions
|
@ -159,8 +159,6 @@ option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
||||||
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
|
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
|
||||||
|
|
||||||
option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ${EXT_DEFAULT})
|
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)
|
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)
|
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_TESTS "Compile tests" "${BUILD_TESTING}")
|
||||||
|
|
||||||
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT})
|
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT})
|
||||||
|
@ -455,6 +451,28 @@ if (YUZU_USE_CPM)
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
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()
|
else()
|
||||||
# Enforce the search mode of non-required packages for better and shorter failure messages
|
# Enforce the search mode of non-required packages for better and shorter failure messages
|
||||||
find_package(fmt 8 REQUIRED)
|
find_package(fmt 8 REQUIRED)
|
||||||
|
@ -467,7 +485,13 @@ else()
|
||||||
find_package(Opus 1.3 MODULE REQUIRED)
|
find_package(Opus 1.3 MODULE REQUIRED)
|
||||||
find_package(ZLIB 1.2 REQUIRED)
|
find_package(ZLIB 1.2 REQUIRED)
|
||||||
find_package(zstd 1.5 REQUIRED MODULE)
|
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)
|
if (YUZU_TESTS)
|
||||||
find_package(Catch2 3.0.1 REQUIRED)
|
find_package(Catch2 3.0.1 REQUIRED)
|
||||||
|
@ -594,10 +618,8 @@ endfunction()
|
||||||
add_subdirectory(externals)
|
add_subdirectory(externals)
|
||||||
|
|
||||||
# pass targets from externals
|
# pass targets from externals
|
||||||
find_package(VulkanUtilityLibraries)
|
|
||||||
find_package(libusb)
|
find_package(libusb)
|
||||||
find_package(VulkanMemoryAllocator)
|
find_package(VulkanMemoryAllocator)
|
||||||
find_package(SPIRV-Tools)
|
|
||||||
|
|
||||||
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||||
find_package(xbyak)
|
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"
|
"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": {
|
"cubeb": {
|
||||||
"repo": "mozilla/cubeb",
|
"repo": "mozilla/cubeb",
|
||||||
"sha": "fa02160712",
|
"sha": "fa02160712",
|
||||||
|
|
76
externals/CMakeLists.txt
vendored
76
externals/CMakeLists.txt
vendored
|
@ -54,36 +54,27 @@ endif()
|
||||||
# Glad
|
# Glad
|
||||||
add_subdirectory(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
|
# libusb
|
||||||
if (ENABLE_LIBUSB)
|
if (ENABLE_LIBUSB)
|
||||||
add_subdirectory(libusb)
|
add_subdirectory(libusb)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Sirit
|
# VMA
|
||||||
# TODO(crueter): spirv-tools doesn't work w/ system
|
AddJsonPackage(vulkan-memory-allocator)
|
||||||
set(SPIRV_WERROR OFF)
|
|
||||||
AddJsonPackage(spirv-headers)
|
|
||||||
|
|
||||||
|
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)
|
AddJsonPackage(sirit)
|
||||||
|
|
||||||
if(MSVC AND USE_CCACHE AND sirit_ADDED)
|
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)
|
set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE)
|
||||||
endif()
|
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)
|
# TZDB (Time Zone Database)
|
||||||
add_subdirectory(nx_tzdb)
|
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)
|
if (NOT TARGET LLVM::Demangle)
|
||||||
add_library(demangle demangle/ItaniumDemangle.cpp)
|
add_library(demangle demangle/ItaniumDemangle.cpp)
|
||||||
target_include_directories(demangle PUBLIC ./demangle)
|
target_include_directories(demangle PUBLIC ./demangle)
|
||||||
|
|
42
externals/cpmfile.json
vendored
42
externals/cpmfile.json
vendored
|
@ -1,15 +1,10 @@
|
||||||
{
|
{
|
||||||
"mbedtls": {
|
"vulkan-memory-allocator": {
|
||||||
"repo": "eden-emulator/mbedtls",
|
"package": "VulkanMemoryAllocator",
|
||||||
"sha": "ce4f81f4a9",
|
"repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator",
|
||||||
"hash": "f2e7f887651b28745e508149214d409fd7cfdb92cb94b4146b47ff1e0fc09e47143f203ac18e34c2c1814b5bd031d04c74828676c0d4342920a2ddb7fd35e9a5",
|
"sha": "1076b348ab",
|
||||||
"find_args": "MODULE"
|
"hash": "a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772",
|
||||||
},
|
"find_args": "CONFIG"
|
||||||
"spirv-headers": {
|
|
||||||
"package": "SPIRV-Headers",
|
|
||||||
"repo": "KhronosGroup/SPIRV-Headers",
|
|
||||||
"sha": "4e209d3d7e",
|
|
||||||
"hash": "f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4"
|
|
||||||
},
|
},
|
||||||
"sirit": {
|
"sirit": {
|
||||||
"repo": "eden-emulator/sirit",
|
"repo": "eden-emulator/sirit",
|
||||||
|
@ -35,31 +30,6 @@
|
||||||
"CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
|
"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": {
|
"xbyak_sun": {
|
||||||
"package": "xbyak",
|
"package": "xbyak",
|
||||||
"repo": "herumi/xbyak",
|
"repo": "herumi/xbyak",
|
||||||
|
|
12
externals/libusb/CMakeLists.txt
vendored
12
externals/libusb/CMakeLists.txt
vendored
|
@ -3,7 +3,17 @@
|
||||||
|
|
||||||
include(CPMUtil)
|
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)
|
if (NOT libusb_ADDED)
|
||||||
return()
|
return()
|
||||||
|
|
|
@ -36,17 +36,18 @@ import androidx.core.net.toUri
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
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.BooleanSetting
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
||||||
import org.yuzu.yuzu_emu.utils.NativeConfig
|
|
||||||
|
|
||||||
class GameAdapter(private val activity: AppCompatActivity) :
|
class GameAdapter(private val activity: AppCompatActivity) :
|
||||||
AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>(exact = false) {
|
AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>(exact = false) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val VIEW_TYPE_GRID = 0
|
const val VIEW_TYPE_GRID = 0
|
||||||
const val VIEW_TYPE_LIST = 1
|
const val VIEW_TYPE_GRID_COMPACT = 1
|
||||||
const val VIEW_TYPE_CAROUSEL = 2
|
const val VIEW_TYPE_LIST = 2
|
||||||
|
const val VIEW_TYPE_CAROUSEL = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
private var viewType = 0
|
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.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
listBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
|
listBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_TYPE_GRID -> {
|
VIEW_TYPE_GRID -> {
|
||||||
val gridBinding = holder.binding as CardGameGridBinding
|
val gridBinding = holder.binding as CardGameGridBinding
|
||||||
gridBinding.cardGameGrid.scaleX = 1f
|
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.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
gridBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
|
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 -> {
|
VIEW_TYPE_CAROUSEL -> {
|
||||||
val carouselBinding = holder.binding as CardGameCarouselBinding
|
val carouselBinding = holder.binding as CardGameCarouselBinding
|
||||||
// soothens transient flickering
|
// soothens transient flickering
|
||||||
|
@ -105,16 +118,25 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
||||||
parent,
|
parent,
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
VIEW_TYPE_GRID -> CardGameGridBinding.inflate(
|
VIEW_TYPE_GRID -> CardGameGridBinding.inflate(
|
||||||
LayoutInflater.from(parent.context),
|
LayoutInflater.from(parent.context),
|
||||||
parent,
|
parent,
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
|
VIEW_TYPE_GRID_COMPACT -> CardGameGridCompactBinding.inflate(
|
||||||
|
LayoutInflater.from(parent.context),
|
||||||
|
parent,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
|
||||||
VIEW_TYPE_CAROUSEL -> CardGameCarouselBinding.inflate(
|
VIEW_TYPE_CAROUSEL -> CardGameCarouselBinding.inflate(
|
||||||
LayoutInflater.from(parent.context),
|
LayoutInflater.from(parent.context),
|
||||||
parent,
|
parent,
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
else -> throw IllegalArgumentException("Invalid view type")
|
else -> throw IllegalArgumentException("Invalid view type")
|
||||||
}
|
}
|
||||||
return GameViewHolder(binding, viewType)
|
return GameViewHolder(binding, viewType)
|
||||||
|
@ -130,6 +152,7 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
||||||
VIEW_TYPE_LIST -> bindListView(model)
|
VIEW_TYPE_LIST -> bindListView(model)
|
||||||
VIEW_TYPE_GRID -> bindGridView(model)
|
VIEW_TYPE_GRID -> bindGridView(model)
|
||||||
VIEW_TYPE_CAROUSEL -> bindCarouselView(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
|
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) {
|
private fun bindCarouselView(model: Game) {
|
||||||
val carouselBinding = binding as CardGameCarouselBinding
|
val carouselBinding = binding as CardGameCarouselBinding
|
||||||
|
|
||||||
|
|
|
@ -194,6 +194,10 @@ class GamesFragment : Fragment() {
|
||||||
val columns = resources.getInteger(R.integer.game_columns_grid)
|
val columns = resources.getInteger(R.integer.game_columns_grid)
|
||||||
GridLayoutManager(context, columns)
|
GridLayoutManager(context, columns)
|
||||||
}
|
}
|
||||||
|
GameAdapter.VIEW_TYPE_GRID_COMPACT -> {
|
||||||
|
val columns = resources.getInteger(R.integer.game_columns_grid)
|
||||||
|
GridLayoutManager(context, columns)
|
||||||
|
}
|
||||||
GameAdapter.VIEW_TYPE_LIST -> {
|
GameAdapter.VIEW_TYPE_LIST -> {
|
||||||
val columns = resources.getInteger(R.integer.game_columns_list)
|
val columns = resources.getInteger(R.integer.game_columns_list)
|
||||||
GridLayoutManager(context, columns)
|
GridLayoutManager(context, columns)
|
||||||
|
@ -300,6 +304,7 @@ class GamesFragment : Fragment() {
|
||||||
val currentViewType = getCurrentViewType()
|
val currentViewType = getCurrentViewType()
|
||||||
when (currentViewType) {
|
when (currentViewType) {
|
||||||
GameAdapter.VIEW_TYPE_LIST -> popup.menu.findItem(R.id.view_list).isChecked = true
|
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_GRID -> popup.menu.findItem(R.id.view_grid).isChecked = true
|
||||||
GameAdapter.VIEW_TYPE_CAROUSEL -> popup.menu.findItem(R.id.view_carousel).isChecked = true
|
GameAdapter.VIEW_TYPE_CAROUSEL -> popup.menu.findItem(R.id.view_carousel).isChecked = true
|
||||||
}
|
}
|
||||||
|
@ -314,6 +319,14 @@ class GamesFragment : Fragment() {
|
||||||
true
|
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 -> {
|
R.id.view_list -> {
|
||||||
if (getCurrentViewType() == GameAdapter.VIEW_TYPE_CAROUSEL) onPause()
|
if (getCurrentViewType() == GameAdapter.VIEW_TYPE_CAROUSEL) onPause()
|
||||||
setCurrentViewType(GameAdapter.VIEW_TYPE_LIST)
|
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_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
android:focusableInTouchMode="false">
|
android:focusableInTouchMode="false"
|
||||||
|
android:padding="4dp">
|
||||||
|
|
||||||
<org.yuzu.yuzu_emu.views.GradientBorderCardView
|
<org.yuzu.yuzu_emu.views.GradientBorderCardView
|
||||||
android:id="@+id/card_game_grid"
|
android:id="@+id/card_game_grid"
|
||||||
app:cardElevation="0dp"
|
app:cardElevation="0dp"
|
||||||
app:cardBackgroundColor="@color/eden_card_background"
|
app:cardBackgroundColor="@color/eden_card_background"
|
||||||
app:strokeWidth="1dp"
|
app:strokeWidth="0dp"
|
||||||
app:strokeColor="@color/eden_border"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
|
android:layout_margin="4dp"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:clipToPadding="true"
|
android:clipToPadding="true"
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
android:transitionName="card_game"
|
android:transitionName="card_game"
|
||||||
app:cardCornerRadius="16dp">
|
app:cardCornerRadius="16dp"
|
||||||
|
android:foreground="@color/eden_border_gradient_start">
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="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
|
<com.google.android.material.imageview.ShapeableImageView
|
||||||
android:id="@+id/image_game_screen"
|
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
|
<item
|
||||||
android:id="@+id/view_grid"
|
android:id="@+id/view_grid"
|
||||||
android:title="@string/view_grid"/>
|
android:title="@string/view_grid"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/view_grid_compact"
|
||||||
|
android:title="@string/view_grid_compact"/>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/view_list"
|
android:id="@+id/view_list"
|
||||||
android:title="@string/view_list"
|
android:title="@string/view_list"
|
||||||
|
|
|
@ -266,6 +266,7 @@
|
||||||
<string name="alphabetical">Alphabetical</string>
|
<string name="alphabetical">Alphabetical</string>
|
||||||
<string name="view_list">List</string>
|
<string name="view_list">List</string>
|
||||||
<string name="view_grid">Grid</string>
|
<string name="view_grid">Grid</string>
|
||||||
|
<string name="view_grid_compact">Compact Grid</string>
|
||||||
<string name="view_carousel">Carousel</string>
|
<string name="view_carousel">Carousel</string>
|
||||||
<string name="game_image_desc">Screenshot for %1$s</string>
|
<string name="game_image_desc">Screenshot for %1$s</string>
|
||||||
<string name="folder">Folder</string>
|
<string name="folder">Folder</string>
|
||||||
|
|
|
@ -1200,7 +1200,7 @@ else()
|
||||||
target_link_libraries(core PUBLIC Boost::headers)
|
target_link_libraries(core PUBLIC Boost::headers)
|
||||||
endif()
|
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)
|
if (MINGW)
|
||||||
target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY})
|
target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY})
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -16,7 +16,7 @@ struct CipherContext;
|
||||||
enum class Mode {
|
enum class Mode {
|
||||||
CTR = 11,
|
CTR = 11,
|
||||||
ECB = 2,
|
ECB = 2,
|
||||||
XTS = 70,
|
XTS = 74,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Op {
|
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) {
|
while (out.size() < target_size) {
|
||||||
out.resize(out.size() + 0x20);
|
out.resize(out.size() + 0x20);
|
||||||
seed_exp[in_size + 3] = static_cast<u8>(i);
|
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;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,7 @@ std::array<u8, key_size> FindKeyFromHex(const std::vector<u8>& binary,
|
||||||
|
|
||||||
std::array<u8, 0x20> temp{};
|
std::array<u8, 0x20> temp{};
|
||||||
for (size_t i = 0; i < binary.size() - key_size; ++i) {
|
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)
|
if (temp != hash)
|
||||||
continue;
|
continue;
|
||||||
|
@ -206,7 +206,7 @@ static std::array<Key128, 0x20> FindEncryptedMasterKeyFromHex(const std::vector<
|
||||||
AESCipher<Key128> cipher(key, Mode::ECB);
|
AESCipher<Key128> cipher(key, Mode::ECB);
|
||||||
for (size_t i = 0; i < binary.size() - 0x10; ++i) {
|
for (size_t i = 0; i < binary.size() - 0x10; ++i) {
|
||||||
cipher.Transcode(binary.data() + i, dec_temp.size(), dec_temp.data(), Op::Decrypt);
|
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) {
|
for (size_t k = 0; k < out.size(); ++k) {
|
||||||
if (temp == master_key_hashes[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{};
|
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 =
|
const auto format_str =
|
||||||
fmt::runtime(cnmt_suffix ? "/000000{:02X}/{}.cnmt.nca" : "/000000{:02X}/{}.nca");
|
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{};
|
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 dirname = fmt::format("000000{:02X}", hash[0]);
|
||||||
|
|
||||||
const auto dir2 = GetOrCreateDirectoryRelative(dir, dirname);
|
const auto dir2 = GetOrCreateDirectoryRelative(dir, dirname);
|
||||||
|
@ -170,7 +170,7 @@ bool PlaceholderCache::Delete(const NcaID& id) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Crypto::SHA256Hash hash{};
|
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 dirname = fmt::format("000000{:02X}", hash[0]);
|
||||||
|
|
||||||
const auto dir2 = GetOrCreateDirectoryRelative(dir, dirname);
|
const auto dir2 = GetOrCreateDirectoryRelative(dir, dirname);
|
||||||
|
@ -665,7 +665,7 @@ InstallResult RegisteredCache::InstallEntry(const NCA& nca, TitleType type,
|
||||||
const OptionalHeader opt_header{0, 0};
|
const OptionalHeader opt_header{0, 0};
|
||||||
ContentRecord c_rec{{}, {}, {}, GetCRTypeFromNCAType(nca.GetType()), {}};
|
ContentRecord c_rec{{}, {}, {}, GetCRTypeFromNCAType(nca.GetType()), {}};
|
||||||
const auto& data = nca.GetBaseFile()->ReadBytes(0x100000);
|
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);
|
std::memcpy(&c_rec.nca_id, &c_rec.hash, 16);
|
||||||
const CNMT new_cnmt(header, opt_header, {c_rec}, {});
|
const CNMT new_cnmt(header, opt_header, {c_rec}, {});
|
||||||
if (!RawInstallYuzuMeta(new_cnmt)) {
|
if (!RawInstallYuzuMeta(new_cnmt)) {
|
||||||
|
@ -776,7 +776,7 @@ InstallResult RegisteredCache::RawInstallNCA(const NCA& nca, const VfsCopyFuncti
|
||||||
id = *override_id;
|
id = *override_id;
|
||||||
} else {
|
} else {
|
||||||
const auto& data = in->ReadBytes(0x100000);
|
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);
|
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>()),
|
: header(std::make_unique<NAXHeader>()),
|
||||||
file(std::move(file_)), keys{Core::Crypto::KeyManager::Instance()} {
|
file(std::move(file_)), keys{Core::Crypto::KeyManager::Instance()} {
|
||||||
Core::Crypto::SHA256Hash hash{};
|
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],
|
status = Parse(fmt::format("/registered/000000{:02X}/{}.nca", hash[0],
|
||||||
Common::HexToString(nca_id, false)));
|
Common::HexToString(nca_id, false)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace Service::BCAT {
|
||||||
static BcatDigest DigestFile(const FileSys::VirtualFile& file) {
|
static BcatDigest DigestFile(const FileSys::VirtualFile& file) {
|
||||||
BcatDigest out{};
|
BcatDigest out{};
|
||||||
const auto bytes = file->ReadAllBytes();
|
const auto bytes = file->ReadAllBytes();
|
||||||
mbedtls_md5_ret(bytes.data(), bytes.size(), out.data());
|
mbedtls_md5(bytes.data(), bytes.size(), out.data());
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,7 @@ struct ProcessContext {
|
||||||
std::vector<u8> nro_data(size);
|
std::vector<u8> nro_data(size);
|
||||||
m_process->GetMemory().ReadBlock(base_address, nro_data.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++) {
|
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.
|
// Initialize sha256 verification context.
|
||||||
mbedtls_sha256_context ctx;
|
mbedtls_sha256_context ctx;
|
||||||
mbedtls_sha256_init(&ctx);
|
mbedtls_sha256_init(&ctx);
|
||||||
mbedtls_sha256_starts_ret(&ctx, 0);
|
mbedtls_sha256_starts(&ctx, 0);
|
||||||
|
|
||||||
// Ensure we maintain a clean state on exit.
|
// Ensure we maintain a clean state on exit.
|
||||||
SCOPE_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);
|
const size_t read_size = file->Read(buffer.data(), intended_read_size, processed_size);
|
||||||
|
|
||||||
// Update the hash function with the buffer contents.
|
// 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.
|
// Update counters.
|
||||||
processed_size += read_size;
|
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.
|
// Finalize context and compute the output hash.
|
||||||
std::array<u8, NcaSha256HashLength> 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.
|
// Compare to expected.
|
||||||
if (std::memcmp(input_hash.data(), output_hash.data(), NcaSha256HalfHashLength) != 0) {
|
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)
|
target_link_libraries(yuzu-room PRIVATE web_service)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(yuzu-room PRIVATE mbedtls mbedcrypto)
|
target_link_libraries(yuzu-room PRIVATE MbedTLS::mbedcrypto MbedTLS::mbedtls)
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_link_libraries(yuzu-room PRIVATE getopt)
|
target_link_libraries(yuzu-room PRIVATE getopt)
|
||||||
endif()
|
endif()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue