Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

torzu: init at unstable 12.15.24 #368370

Merged
merged 1 commit into from
Jan 1, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions pkgs/by-name/to/torzu/fix-debugger.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
diff --git a/src/core/debugger/debugger.cpp b/src/core/debugger/debugger.cpp
index e86aae8460..a4dca23770 100644
--- a/src/core/debugger/debugger.cpp
+++ b/src/core/debugger/debugger.cpp
@@ -5,7 +5,13 @@
#include <mutex>
#include <thread>

-#include <boost/asio.hpp>
+// Use basic asio functionality only
+#define BOOST_ASIO_STANDALONE
+#include <boost/asio/basic_io_object.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/write.hpp>
+#include <boost/asio/read.hpp>
+
#include <boost/process/async_pipe.hpp>

#include "common/logging/log.h"
@@ -21,17 +27,22 @@

template <typename Readable, typename Buffer, typename Callback>
static void AsyncReceiveInto(Readable& r, Buffer& buffer, Callback&& c) {
- static_assert(std::is_trivial_v<Buffer>);
- auto boost_buffer{boost::asio::buffer(&buffer, sizeof(Buffer))};
- r.async_read_some(
- boost_buffer, [&, c](const boost::system::error_code& error, size_t bytes_read) {
- if (!error.failed()) {
- const u8* buffer_start = reinterpret_cast<const u8*>(&buffer);
- std::span<const u8> received_data{buffer_start, buffer_start + bytes_read};
- c(received_data);
- AsyncReceiveInto(r, buffer, c);
- }
- });
+ try {
+ static_assert(std::is_trivial_v<Buffer>);
+ auto boost_buffer{boost::asio::buffer(&buffer, sizeof(Buffer))};
+ r.async_read_some(
+ boost_buffer,
+ [&, c](const boost::system::error_code& error, size_t bytes_read) {
+ if (!error) {
+ const u8* buffer_start = reinterpret_cast<const u8*>(&buffer);
+ std::span<const u8> received_data{buffer_start, buffer_start + bytes_read};
+ c(received_data);
+ AsyncReceiveInto(r, buffer, c);
+ }
+ });
+ } catch (const std::exception& e) {
+ LOG_ERROR(Debug_GDBStub, "AsyncReceiveInto error: {}", e.what());
+ }
}

template <typename Callback>
30 changes: 30 additions & 0 deletions pkgs/by-name/to/torzu/fix-udp-client.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp
index 60821b31a6..8f9c047218 100644
--- a/src/input_common/drivers/udp_client.cpp
+++ b/src/input_common/drivers/udp_client.cpp
@@ -2,7 +2,15 @@
// SPDX-License-Identifier: GPL-2.0-or-later

#include <random>
-#include <boost/asio.hpp>
+// Include only needed asio components
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/ip/udp.hpp>
+#include <boost/asio/basic_waitable_timer.hpp>
+#include <boost/asio/write.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/asio/basic_socket.hpp>
+#include <boost/asio/ip/address.hpp>
+#include <boost/asio/ip/address_v4.hpp>
#include <fmt/format.h>

#include "common/logging/log.h"
@@ -113,7 +121,7 @@ private:
}

SocketCallback callback;
- boost::asio::io_service io_service;
+ boost::asio::io_context io_service;
boost::asio::basic_waitable_timer<clock> timer;
udp::socket socket;

13 changes: 13 additions & 0 deletions pkgs/by-name/to/torzu/fix-udp-protocol.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/src/input_common/helpers/udp_protocol.h b/src/input_common/helpers/udp_protocol.h
index db08fc62c5..ea223ea937 100644
--- a/src/input_common/helpers/udp_protocol.h
+++ b/src/input_common/helpers/udp_protocol.h
@@ -69,7 +69,7 @@ Message<T> CreateMessage(const u32 magic, const T data, const u32 sender_id) {
};
Message<T> message{header, data};
crc.process_bytes(&message, sizeof(Message<T>));
- message.header.crc = crc.checksum();
+ message.header.crc = static_cast<u32_le>(crc.checksum());
return message;
}

244 changes: 244 additions & 0 deletions pkgs/by-name/to/torzu/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
{
lib,
stdenv,
SDL2,
autoconf,
boost,
catch2_3,
cmake,
fetchFromGitHub,
cpp-jwt,
cubeb,
discord-rpc,
enet,
fetchgit,
fetchurl,
ffmpeg-headless,
fmt,
glslang,
libopus,
libusb1,
libva,
lz4,
python3,
unzip,
nix-update-script,
nlohmann_json,
nv-codec-headers-12,
pkg-config,
qt6,
vulkan-headers,
vulkan-loader,
yasm,
simpleini,
zlib,
vulkan-memory-allocator,
zstd,
}:

let
inherit (qt6)
qtbase
qtmultimedia
qtwayland
wrapQtAppsHook
qttools
qtwebengine
;

compat-list = stdenv.mkDerivation {
pname = "yuzu-compatibility-list";
version = "unstable-2024-02-26";

src = fetchFromGitHub {
owner = "flathub";
repo = "org.yuzu_emu.yuzu";
rev = "9c2032a3c7e64772a8112b77ed8b660242172068";
hash = "sha256-ITh/W4vfC9w9t+TJnPeTZwWifnhTNKX54JSSdpgaoBk=";
};

buildCommand = ''
cp $src/compatibility_list.json $out
'';
};

nx_tzdb = stdenv.mkDerivation rec {
pname = "nx_tzdb";
version = "221202";

src = fetchurl {
url = "https://github.com/lat9nq/tzdb_to_nx/releases/download/${version}/${version}.zip";
hash = "sha256-mRzW+iIwrU1zsxHmf+0RArU8BShAoEMvCz+McXFFK3c=";
};

nativeBuildInputs = [ unzip ];

buildCommand = ''
unzip $src -d $out
'';

};

in

stdenv.mkDerivation (finalAttrs: {
pname = "torzu";
version = "unstable-2024-12-15";

src = fetchgit {
url = "https://notabug.org/litucks/torzu";
rev = "02cfee3f184e6fdcc3b483ef399fb5d2bb1e8ec7";
hash = "sha256-hAWMFzTNJGFcrXov5LKMdW9YWhsu7wueATmiuS7EVkI=";
fetchSubmodules = true;
};

patches = [
# Remove coroutines from debugger to fix boost::asio compatibility issues
./fix-debugger.patch
# Add explicit cast for CRC checksum value
./fix-udp-protocol.patch
# Use specific boost::asio includes and update to modern io_context
./fix-udp-client.patch
];

nativeBuildInputs = [
cmake
glslang
pkg-config
python3
qttools
wrapQtAppsHook
];

buildInputs = [
# vulkan-headers must come first, so the older propagated versions
# don't get picked up by accident
vulkan-headers

boost
catch2_3
cpp-jwt
cubeb
discord-rpc
# intentionally omitted: dynarmic - prefer vendored version for compatibility
enet

# ffmpeg deps (also includes vendored)
# we do not use internal ffmpeg because cuda errors
autoconf
yasm
libva # for accelerated video decode on non-nvidia
nv-codec-headers-12 # for accelerated video decode on nvidia
ffmpeg-headless
# end ffmpeg deps

fmt
# intentionally omitted: gamemode - loaded dynamically at runtime
# intentionally omitted: httplib - upstream requires an older version than what we have
libopus
libusb1
# intentionally omitted: LLVM - heavy, only used for stack traces in the debugger
lz4
nlohmann_json
qtbase
qtmultimedia
qtwayland
qtwebengine
# intentionally omitted: renderdoc - heavy, developer only
SDL2
# intentionally omitted: stb - header only libraries, vendor uses git snapshot
vulkan-memory-allocator
# intentionally omitted: xbyak - prefer vendored version for compatibility
zlib
zstd
];

# This changes `ir/opt` to `ir/var/empty` in `externals/dynarmic/src/dynarmic/CMakeLists.txt`
# making the build fail, as that path does not exist
dontFixCmake = true;

cmakeFlags = [
# actually has a noticeable performance impact
(lib.cmakeBool "YUZU_ENABLE_LTO" true)
(lib.cmakeBool "YUZU_TESTS" false)

(lib.cmakeBool "ENABLE_QT6" true)
(lib.cmakeBool "ENABLE_QT_TRANSLATION" true)

# use system libraries
# NB: "external" here means "from the externals/ directory in the source",
# so "off" means "use system"
(lib.cmakeBool "YUZU_USE_EXTERNAL_SDL2" false)
(lib.cmakeBool "YUZU_USE_EXTERNAL_VULKAN_HEADERS" true)
"-DVulkan_INCLUDE_DIRS=${vulkan-headers}/include"

# # don't use system ffmpeg, suyu uses internal APIs
# (lib.cmakeBool "YUZU_USE_BUNDLED_FFMPEG" true)

# don't check for missing submodules
(lib.cmakeBool "YUZU_CHECK_SUBMODULES" false)

# enable some optional features
(lib.cmakeBool "YUZU_USE_QT_WEB_ENGINE" true)
(lib.cmakeBool "YUZU_USE_QT_MULTIMEDIA" true)
(lib.cmakeBool "USE_DISCORD_PRESENCE" true)

# We dont want to bother upstream with potentially outdated compat reports
(lib.cmakeBool "YUZU_ENABLE_COMPATIBILITY_REPORTING" false)
(lib.cmakeBool "ENABLE_COMPATIBILITY_LIST_DOWNLOAD" false) # We provide this deterministically
];

env = {
# Does some handrolled SIMD
NIX_CFLAGS_COMPILE = lib.optionalString stdenv.hostPlatform.isx86_64 "-msse4.1";
};

qtWrapperArgs = [
# Fixes vulkan detection.
# FIXME: patchelf --add-rpath corrupts the binary for some reason, investigate
"--prefix LD_LIBRARY_PATH : ${vulkan-loader}/lib"
];

# Setting this through cmakeFlags does not work.
# https://github.com/NixOS/nixpkgs/issues/114044
preConfigure = lib.concatStringsSep "\n" [
''
cmakeFlagsArray+=(
"-DTITLE_BAR_FORMAT_IDLE=${finalAttrs.pname} | ${finalAttrs.version} (nixpkgs) {}"
"-DTITLE_BAR_FORMAT_RUNNING=${finalAttrs.pname} | ${finalAttrs.version} (nixpkgs) | {}"
)
''
# provide pre-downloaded tz data
''
mkdir -p build/externals/nx_tzdb
ln -s ${nx_tzdb} build/externals/nx_tzdb/nx_tzdb
''
];

postConfigure = ''
ln -sf ${compat-list} ./dist/compatibility_list/compatibility_list.json
'';

postInstall = "
install -Dm444 $src/dist/72-yuzu-input.rules $out/lib/udev/rules.d/72-yuzu-input.rules
";

meta = {
description = "Fork of yuzu, an open-source Nintendo Switch emulator";
homepage = "https://notabug.org/litucks/torzu";
mainProgram = "yuzu";
platforms = lib.platforms.linux;
badPlatforms = [
# Several conversion errors, probably caused by the update to GCC 14
"aarch64-linux"
];
maintainers = with lib.maintainers; [ liberodark ];
license = with lib.licenses; [
gpl3Plus
# Icons
asl20
mit
cc0
];
};
})
Loading