View | Details | Raw Unified | Return to bug 257175
Collapse All | Expand All

(-)b/emulators/xenia/Makefile (+131 lines)
Added Link Here
1
# Created by: Timothy Beyer <beyert@cs.ucr.edu>
2
3
PORTNAME=	xenia
4
PORTVERSION=	0.20210609
5
CATEGORIES=	emulators games
6
7
MAINTAINER=	beyert@cs.ucr.edu
8
COMMENT=	Xbox 360 Emulator
9
10
LICENSE=	BSD3CLAUSE
11
LICENSE_FILE=	${WRKSRC}/LICENSE
12
13
ONLY_FOR_ARCHS=	amd64
14
15
BUILD_DEPENDS=	vulkan-loader>0:graphics/vulkan-loader \
16
	${LOCALBASE}/include/vulkan/vulkan.hpp:graphics/vulkan-headers \
17
	nasm:devel/nasm
18
LIB_DEPENDS=	libvulkan.so:graphics/vulkan-loader \
19
	liblz4.so:archivers/liblz4 \
20
	libavcodec.so:multimedia/ffmpeg \
21
	libavutil.so:multimedia/ffmpeg \
22
	libboost_atomic.so:devel/boost-libs
23
24
USES=		compiler:c++17-lang lua:build:51 gmake python:build shebangfix \
25
	gl xorg sdl gnome pkgconfig
26
27
SHEBANG_FILES=	${WRKSRC}/xenia-build
28
29
USE_LDCONFIG=	yes
30
31
USE_XORG=	x11 xcb
32
USE_GL=		gl glew glu
33
USE_SDL=	sdl2
34
USE_GNOME=	gtk30 pango atk cairo gdkpixbuf2 glib20
35
36
OPTIONS_DEFINE=	NLS
37
38
NLS_USES=	gettext-runtime
39
40
USE_GITHUB=	yes
41
GH_TUPLE=	xenia-project:xenia:14bac72 \
42
	xenia-project:premake-core:7eba282:premake_core/third_party/premake-core \
43
	xenia-project:premake-export-compile-commands:59e3e55:premake_export_compile_commands/third_party/premake-export-compile-commands \
44
	Enhex:premake-cmake:c4fec3e:premake_cmake/third_party/premake-cmake \
45
	Tencent:rapidjson:d87b698:rapidjson/third_party/rapidjson \
46
	xenia-project:snappy:303cd2c:snappy/third_party/snappy \
47
	KhronosGroup:SPIRV-Headers:2bf91d3:spirv_headers/third_party/spirv-headers \
48
	xenia-project:SPIRV-Tools:27a2bbb:spirv_tools/third_party/spirv-tools \
49
	xenia-project:utfcpp:f295c4b:utfcpp/third_party/utfcpp \
50
	zeux:volk:30a851b:volk/third_party/volk \
51
	xenia-project:xbyak:bc70e7e:xbyak/third_party/xbyak \
52
	Cyan4973:xxHash:4c881f7:xxhash/third_party/xxhash \
53
	Triang3l:premake-androidmk:01a84c7:premake_androidmk/third_party/premake-androidmk \
54
	xenia-project:FFmpeg:09eac85:ffmpeg/third_party/FFmpeg \
55
	openluopworld:aes_128:b5b7f55:aes_128/third_party/aes_128 \
56
	xenia-project:capstone:f9c6a90:capstone/third_party/capstone \
57
	discord:discord-rpc:eff23a7:discord_rpc/third_party/discord-rpc \
58
	fmtlib:fmt:27e3c0f:fmt/third_party/fmt \
59
	ocornut:imgui:ca30ef4:imgui/third_party/imgui \
60
	jarro2783:cxxopts:48e265d:cxxopts/third_party/cxxopts \
61
	HowardHinnant:date:97246a6:date/third_party/date \
62
	libsdl-org:SDL:d28437d:sdl2/third_party/SDL2 \
63
	microsoft:DirectXShaderCompiler:6b6f402:direct_x_shader_compiler/third_party/DirectXShaderCompiler \
64
	benvanik:binutils-ppc-cygwin:6f3f15d:binutils_ppc_cygwin/third_party/binutils-ppc-cygwin \
65
	catchorg:Catch2:5c88067:catch/third_party/catch \
66
	skystrife:cpptoml:fededad:cpptoml/third_party/cpptoml \
67
	xenia-project:disruptorplus:cb83e4b:disruptorplus/third_party/disruptorplus \
68
	boostorg:nowide:4412f9f:nowide/third_party/nowide
69
70
CFLAGS+=	-I${LOCALBASE}/include -ferror-limit=0
71
CXXFLAGS+=	-I${LOCALBASE}/include -ferror-limit=0
72
73
.include <bsd.port.pre.mk>
74
75
CFLAGS+=	-I${WRKSRC}/third_party/FFmpeg \
76
	-I${WRKSRC}/third_party/FFmpeg/libavutil \
77
	-I${WRKSRC}/third_party/fmt/include \
78
	-I${WRKSRC}/third_party/nowide/include
79
CXXFLAGS+=	-I${WRKSRC}/third_party/FFmpeg \
80
	-I${WRKSRC}/third_party/FFmpeg/libavutil \
81
	-I${WRKSRC}/third_party/fmt/include \
82
	-I${WRKSRC}/third_party/nowide/include
83
84
LDFLAGS+=	-L${LOCALBASE}/lib
85
#MAKE_ARGS+=	verbose=true
86
87
CONFIGURE_ARGS=	--enable-static \
88
		--disable-shared \
89
		--enable-pic \
90
		--disable-gpl \
91
		--enable-avresample \
92
		--cc="${CC}" \
93
		--cxx="${CXX}"
94
95
pre-patch:
96
	${CP} -pR ${WRKSRC}/third_party/aes_128/aes.h \
97
		${WRKSRC}/third_party/aes_128/unroll/
98
99
post-patch:
100
	${REINPLACE_CMD} 's|fseeko64|fseeko|g' \
101
		${WRKSRC}/src/xenia/base/filesystem_posix.cc
102
	${REINPLACE_CMD} 's|ftello64|ftello|g' \
103
		${WRKSRC}/src/xenia/base/filesystem_posix.cc
104
	${REINPLACE_CMD} 's|ftruncate64|ftruncate|g' \
105
		${WRKSRC}/src/xenia/base/filesystem_posix.cc \
106
		${WRKSRC}/src/xenia/base/memory_posix.cc
107
	${REINPLACE_CMD} 's|mmap64|mmap|g' \
108
		${WRKSRC}/src/xenia/base/memory_posix.cc
109
110
pre-build:
111
	${REINPLACE_CMD} "s|'make'|'gmake'|g" ${WRKSRC}/tools/build/premake \
112
		${WRKSRC}/xenia-build
113
	cd ${WRKSRC} && ./xenia-build setup
114
## necessary, but insufficient alone to build libavutil / libavcodec
115
.if !exists(${WRKSRC}/third_party/FFmpeg/Makefile)
116
	test -f ${WRKSRC}/third_party/FFmpeg/config.asm && \
117
		echo "no configure needed" || \
118
		(cd ${WRKSRC}/third_party/FFmpeg && ./configure ${CONFIGURE_ARGS})
119
.endif
120
121
PLIST_FILES=	bin/xenia
122
123
do-build:
124
#	cd ${WRKSRC} && ./xenia-build build
125
	cd ${WRKSRC}/build && ${GMAKE} ${MAKE_ARGS}
126
127
do-install:
128
	${INSTALL} ${WRKSRC}/build/bin/Linux/Checked/xenia \
129
		${STAGEDIR}/${PREFIX}/bin/xenia
130
131
.include <bsd.port.post.mk>
(-)b/emulators/xenia/distinfo (+57 lines)
Added Link Here
1
TIMESTAMP = 1625521923
2
SHA256 (xenia-project-xenia-0.20210609-14bac72_GH0.tar.gz) = 8a8e584255f052020716a6d62ff21d7489c0c0bac25598a271f8dbf02dd9de0c
3
SIZE (xenia-project-xenia-0.20210609-14bac72_GH0.tar.gz) = 6639921
4
SHA256 (xenia-project-premake-core-7eba282_GH0.tar.gz) = 073aec18425cbe82da8b6bdcb4c0f1781549a25503c8c982aba2e48164d0a183
5
SIZE (xenia-project-premake-core-7eba282_GH0.tar.gz) = 3959564
6
SHA256 (xenia-project-premake-export-compile-commands-59e3e55_GH0.tar.gz) = e43ff41bb0c6ec71ec71e82272cd798e21edff8f040cf39ad089626e4625c8b8
7
SIZE (xenia-project-premake-export-compile-commands-59e3e55_GH0.tar.gz) = 2196
8
SHA256 (Enhex-premake-cmake-c4fec3e_GH0.tar.gz) = d9912b969712960e5b3fce0d1c8a12fcc28a31c2059ecc9e60fa60e8f53ca24f
9
SIZE (Enhex-premake-cmake-c4fec3e_GH0.tar.gz) = 8625
10
SHA256 (Tencent-rapidjson-d87b698_GH0.tar.gz) = e1cb07a044dd6e5fef79ace426569c0b767cb3538d93526fdd0ab54a86fbadd6
11
SIZE (Tencent-rapidjson-d87b698_GH0.tar.gz) = 1056587
12
SHA256 (xenia-project-snappy-303cd2c_GH0.tar.gz) = 6d75d3d453466c3b58dd21a70221971d9fbd79bb3c03aa1418cbcd0fad6b3c47
13
SIZE (xenia-project-snappy-303cd2c_GH0.tar.gz) = 1122975
14
SHA256 (KhronosGroup-SPIRV-Headers-2bf91d3_GH0.tar.gz) = 357baf06d7f3512971e4d5cdc1f956c97a71d35c34ebe58048cb7e06afcac6f5
15
SIZE (KhronosGroup-SPIRV-Headers-2bf91d3_GH0.tar.gz) = 269777
16
SHA256 (xenia-project-SPIRV-Tools-27a2bbb_GH0.tar.gz) = ef4571f8fac22512fdca3fc2c6024b0046a0379321a6aeef09260c7815b6e8d9
17
SIZE (xenia-project-SPIRV-Tools-27a2bbb_GH0.tar.gz) = 1126885
18
SHA256 (xenia-project-utfcpp-f295c4b_GH0.tar.gz) = fbd18f3800b2c5142af34b987ea43b7e06efab5866a1e9a065871ff4773eaa98
19
SIZE (xenia-project-utfcpp-f295c4b_GH0.tar.gz) = 26521
20
SHA256 (zeux-volk-30a851b_GH0.tar.gz) = e0291ed4a2918a020e42cee1c89eeab82358120565af0d6d5c3f6b6af1671ddf
21
SIZE (zeux-volk-30a851b_GH0.tar.gz) = 18867
22
SHA256 (xenia-project-xbyak-bc70e7e_GH0.tar.gz) = 0b62cb42d776138831190bc4cc58726fa8372a9ae6abf5f30e9862894df78a3d
23
SIZE (xenia-project-xbyak-bc70e7e_GH0.tar.gz) = 214886
24
SHA256 (Cyan4973-xxHash-4c881f7_GH0.tar.gz) = 5e62180e6b0b0fea36b0c71cb056e2ef325d9719cb783f3ce597d57e5dfaf76c
25
SIZE (Cyan4973-xxHash-4c881f7_GH0.tar.gz) = 156911
26
SHA256 (Triang3l-premake-androidmk-01a84c7_GH0.tar.gz) = 848ef95d8d2c0c8a140425a5ad3a62d58878e3424c4bbcb17bfade18626fd3bb
27
SIZE (Triang3l-premake-androidmk-01a84c7_GH0.tar.gz) = 6357
28
SHA256 (xenia-project-FFmpeg-09eac85_GH0.tar.gz) = 778d8228335487c47394148770cd22e35c7a114327de1cb986f94b4dc40b2b9c
29
SIZE (xenia-project-FFmpeg-09eac85_GH0.tar.gz) = 13746426
30
SHA256 (openluopworld-aes_128-b5b7f55_GH0.tar.gz) = f28a2abe08a15fedc3456ab5f6bdf9ca12ebe16ce403ace545caeda097cc5c61
31
SIZE (openluopworld-aes_128-b5b7f55_GH0.tar.gz) = 23615
32
SHA256 (xenia-project-capstone-f9c6a90_GH0.tar.gz) = e5ede1d0df36f723082bff8ab8269ed1b95535583e89323ff3b957861a52e843
33
SIZE (xenia-project-capstone-f9c6a90_GH0.tar.gz) = 3434224
34
SHA256 (discord-discord-rpc-eff23a7_GH0.tar.gz) = 0ac2f073cddb51c77959ba8b5e81efb6bfae750d5fae35322107faeb24ada937
35
SIZE (discord-discord-rpc-eff23a7_GH0.tar.gz) = 2107798
36
SHA256 (fmtlib-fmt-27e3c0f_GH0.tar.gz) = 98dce71ba3a092ba0ac18735f48e1769ab66d30c457b18518fd5d25631f04835
37
SIZE (fmtlib-fmt-27e3c0f_GH0.tar.gz) = 733462
38
SHA256 (ocornut-imgui-ca30ef4_GH0.tar.gz) = e13c13a90c22883a08d0be96346926efe9c3bbc90993747780e77a5e775f2c74
39
SIZE (ocornut-imgui-ca30ef4_GH0.tar.gz) = 1222397
40
SHA256 (jarro2783-cxxopts-48e265d_GH0.tar.gz) = 17b5c6fba32f17a7ae425b915d4097ab19b097d84711f2b53724a67a88d1bd62
41
SIZE (jarro2783-cxxopts-48e265d_GH0.tar.gz) = 88416
42
SHA256 (HowardHinnant-date-97246a6_GH0.tar.gz) = 0567ce5cc82084ca790ce315ee0b4f57f5be3c009c1682e78d14c794e5d7fc28
43
SIZE (HowardHinnant-date-97246a6_GH0.tar.gz) = 824404
44
SHA256 (libsdl-org-SDL-d28437d_GH0.tar.gz) = 878b79cb48ec0f959e9fe5f1998ad65693883cfdf1e0b60681d9b4ba264ec9fb
45
SIZE (libsdl-org-SDL-d28437d_GH0.tar.gz) = 6503674
46
SHA256 (microsoft-DirectXShaderCompiler-6b6f402_GH0.tar.gz) = 95ed2f42a71ae41245bb204979fbb6a3c9421fe3aa3d557ac8188119aeff5548
47
SIZE (microsoft-DirectXShaderCompiler-6b6f402_GH0.tar.gz) = 22760753
48
SHA256 (benvanik-binutils-ppc-cygwin-6f3f15d_GH0.tar.gz) = 995522e41ad3a65426148ff73bda0fe4c1fed70f9985866c47277b645e84e5c4
49
SIZE (benvanik-binutils-ppc-cygwin-6f3f15d_GH0.tar.gz) = 37917842
50
SHA256 (catchorg-Catch2-5c88067_GH0.tar.gz) = 1d24f7db65ddbe5a7a9ff2b7d5131fb02d87c962e0229308231f7b774b25a967
51
SIZE (catchorg-Catch2-5c88067_GH0.tar.gz) = 659840
52
SHA256 (skystrife-cpptoml-fededad_GH0.tar.gz) = dd2d129b67f537ae7d6f8d8d084c8c0d772d0f5b4b3118c1892e67ff536e335e
53
SIZE (skystrife-cpptoml-fededad_GH0.tar.gz) = 47398
54
SHA256 (xenia-project-disruptorplus-cb83e4b_GH0.tar.gz) = f2985a69cf721ff189de2c3fabc7f295e5d6363391bfb990469ea752fc05cd69
55
SIZE (xenia-project-disruptorplus-cb83e4b_GH0.tar.gz) = 25470
56
SHA256 (boostorg-nowide-4412f9f_GH0.tar.gz) = 676e1817c2ea096edc5d13bbe6967113124ace3ff898e1809f0cfdc145a554de
57
SIZE (boostorg-nowide-4412f9f_GH0.tar.gz) = 94878
(-)b/emulators/xenia/files/patch-premake5.lua (+25 lines)
Added Link Here
1
--- premake5.lua.orig	2021-06-09 19:56:36 UTC
2
+++ premake5.lua
3
@@ -21,11 +21,14 @@ includedirs({
4
   ".",
5
   "src",
6
   "third_party",
7
+  "third_party/nowide/include",
8
 })
9
 
10
 defines({
11
   "_UNICODE",
12
   "UNICODE",
13
+  "BOOST_NOWIDE_USE_FILEBUF_REPLACEMENT",
14
+  "BOOST_NOWIDE_FSTREAM_INCLUDED_HPP",
15
 })
16
 
17
 cppdialect("C++17")
18
@@ -102,7 +105,6 @@ filter("platforms:Linux")
19
   })
20
   pkg_config.all("gtk+-x11-3.0")
21
   links({
22
-    "stdc++fs",
23
     "dl",
24
     "lz4",
25
     "pthread",
(-)b/emulators/xenia/files/patch-src_xenia_app_premake5.lua (+13 lines)
Added Link Here
1
--- src/xenia/app/premake5.lua.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/app/premake5.lua
3
@@ -38,8 +38,8 @@ project("xenia-app")
4
     "discord-rpc",
5
     "glslang-spirv",
6
     "imgui",
7
-    "libavcodec",
8
-    "libavutil",
9
+    "avcodec",
10
+    "avutil",
11
     "mspack",
12
     "snappy",
13
     "spirv-tools",
(-)b/emulators/xenia/files/patch-src_xenia_app_xenia__main.cc (+11 lines)
Added Link Here
1
--- src/xenia/app/xenia_main.cc.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/app/xenia_main.cc
3
@@ -226,7 +226,7 @@ int xenia_main(const std::vector<std::string>& args) {
4
     if (!cvars::portable &&
5
         !std::filesystem::exists(storage_root / "portable.txt")) {
6
       storage_root = xe::filesystem::GetUserFolder();
7
-#if defined(XE_PLATFORM_WIN32) || defined(XE_PLATFORM_GNU_LINUX)
8
+#if defined(XE_PLATFORM_WIN32) || defined(XE_PLATFORM_GNU_LINUX) || defined(XE_PLATFORM_FREEBSD)
9
       storage_root = storage_root / "Xenia";
10
 #else
11
       // TODO(Triang3l): Point to the app's external storage "files" directory
(-)b/emulators/xenia/files/patch-src_xenia_apu_premake5.lua (+13 lines)
Added Link Here
1
--- src/xenia/apu/premake5.lua.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/apu/premake5.lua
3
@@ -7,8 +7,8 @@ project("xenia-apu")
4
   kind("StaticLib")
5
   language("C++")
6
   links({
7
-    "libavcodec",
8
-    "libavutil",
9
+    "avcodec",
10
+    "avutil",
11
     "xenia-base",
12
   })
13
   defines({
(-)b/emulators/xenia/files/patch-src_xenia_base_atomic.h (+11 lines)
Added Link Here
1
--- src/xenia/base/atomic.h.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/base/atomic.h
3
@@ -94,7 +94,7 @@ inline bool atomic_cas(int64_t old_value, int64_t new_
4
              old_value) == old_value;
5
 }
6
 
7
-#elif XE_PLATFORM_LINUX
8
+#elif XE_PLATFORM_LINUX || XE_PLATFORM_FREEBSD
9
 
10
 inline int32_t atomic_inc(volatile int32_t* value) {
11
   return __sync_add_and_fetch(value, 1);
(-)b/emulators/xenia/files/patch-src_xenia_base_clock__posix.cc (+26 lines)
Added Link Here
1
--- src/xenia/base/clock_posix.cc.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/base/clock_posix.cc
3
@@ -16,14 +16,14 @@ namespace xe {
4
 
5
 uint64_t Clock::host_tick_frequency_platform() {
6
   timespec res;
7
-  clock_getres(CLOCK_MONOTONIC_RAW, &res);
8
+  clock_getres(CLOCK_MONOTONIC, &res);
9
 
10
   return uint64_t(res.tv_sec) + uint64_t(res.tv_nsec) * 1000000000ull;
11
 }
12
 
13
 uint64_t Clock::host_tick_count_platform() {
14
   timespec res;
15
-  clock_gettime(CLOCK_MONOTONIC_RAW, &res);
16
+  clock_gettime(CLOCK_MONOTONIC, &res);
17
 
18
   return uint64_t(res.tv_sec) + uint64_t(res.tv_nsec) * 1000000000ull;
19
 }
20
@@ -43,4 +43,4 @@ uint64_t Clock::QueryHostUptimeMillis() {
21
   return host_tick_count_platform() * 1000 / host_tick_frequency_platform();
22
 }
23
 
24
-}  // namespace xe
25
\ No newline at end of file
26
+}  // namespace xe
(-)b/emulators/xenia/files/patch-src_xenia_base_platform.h (+11 lines)
Added Link Here
1
--- src/xenia/base/platform.h.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/base/platform.h
3
@@ -37,6 +37,8 @@
4
 #elif defined(__gnu_linux__)
5
 #define XE_PLATFORM_GNU_LINUX 1
6
 #define XE_PLATFORM_LINUX 1
7
+#elif defined(__FreeBSD__)
8
+#define XE_PLATFORM_FREEBSD 1
9
 #else
10
 #error Unsupported target OS.
11
 #endif
(-)b/emulators/xenia/files/patch-src_xenia_base_threading__posix.cc (+63 lines)
Added Link Here
1
--- src/xenia/base/threading_posix.cc.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/base/threading_posix.cc
3
@@ -25,6 +25,11 @@
4
 #include <ctime>
5
 #include <memory>
6
 
7
+#if XE_PLATFORM_FREEBSD
8
+  #include <pthread_np.h>
9
+  #include <sys/cpuset.h>
10
+#endif
11
+
12
 #if XE_PLATFORM_ANDROID
13
 #include <sched.h>
14
 
15
@@ -93,7 +98,11 @@ void EnableAffinityConfiguration() {}
16
 // uint64_t ticks() { return mach_absolute_time(); }
17
 
18
 uint32_t current_thread_system_id() {
19
+#if XE_PLATFORM_FREEBSD
20
+  return static_cast<uint32_t>((unsigned int)pthread_getthreadid_np());
21
+#else
22
   return static_cast<uint32_t>(syscall(SYS_gettid));
23
+#endif
24
 }
25
 
26
 void MaybeYield() {
27
@@ -617,10 +626,17 @@ class PosixCondition<Thread> : public PosixConditionBa
28
   }
29
 #endif
30
 
31
+#if XE_PLATFORM_FREEBSD
32
+  uint32_t system_id() const { return static_cast<uint32_t>((unsigned long)thread_); }
33
+#else
34
   uint32_t system_id() const { return static_cast<uint32_t>(thread_); }
35
+#endif
36
 
37
   uint64_t affinity_mask() {
38
     WaitStarted();
39
+#if XE_PLATFORM_FREEBSD
40
+    typedef cpuset_t cpu_set_t;
41
+#endif
42
     cpu_set_t cpu_set;
43
 #if XE_PLATFORM_ANDROID
44
     if (sched_getaffinity(pthread_gettid_np(thread_), sizeof(cpu_set_t),
45
@@ -643,6 +659,9 @@ class PosixCondition<Thread> : public PosixConditionBa
46
 
47
   void set_affinity_mask(uint64_t mask) {
48
     WaitStarted();
49
+    #if XE_PLATFORM_FREEBSD
50
+    typedef cpuset_t cpu_set_t;
51
+    #endif
52
     cpu_set_t cpu_set;
53
     CPU_ZERO(&cpu_set);
54
     for (auto i = 0u; i < 64; i++) {
55
@@ -691,6 +710,8 @@ class PosixCondition<Thread> : public PosixConditionBa
56
 #if XE_PLATFORM_ANDROID
57
     sigqueue(pthread_gettid_np(thread_),
58
              GetSystemSignal(SignalType::kThreadUserCallback), value);
59
+#elif XE_PLATFORM_FREEBSD
60
+    pthread_kill(thread_, GetSystemSignal(SignalType::kThreadUserCallback));
61
 #else
62
     pthread_sigqueue(thread_, GetSystemSignal(SignalType::kThreadUserCallback),
63
                      value);
(-)b/emulators/xenia/files/patch-src_xenia_config.cc (+30 lines)
Added Link Here
1
--- src/xenia/config.cc.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/config.cc
3
@@ -8,6 +8,7 @@
4
  */
5
 
6
 #include "config.h"
7
+#include <fstream>
8
 
9
 #include "third_party/cpptoml/include/cpptoml.h"
10
 #include "third_party/fmt/include/fmt/format.h"
11
@@ -18,14 +19,13 @@
12
 #include "xenia/base/string.h"
13
 #include "xenia/base/string_buffer.h"
14
 
15
-std::shared_ptr<cpptoml::table> ParseFile(
16
-    const std::filesystem::path& filename) {
17
-  std::ifstream file(filename);
18
-  if (!file.is_open()) {
19
-    throw cpptoml::parse_exception(xe::path_to_utf8(filename) +
20
+std::shared_ptr<cpptoml::table> ParseFile(const std::filesystem::path& fn) {
21
+  std::ifstream ifn(fn);
22
+  if (!ifn.is_open()) {
23
+    throw cpptoml::parse_exception(xe::path_to_utf8(fn) +
24
                                    " could not be opened for parsing");
25
   }
26
-  cpptoml::parser p(file);
27
+  cpptoml::parser p(ifn);
28
   return p.parse();
29
 }
30
 
(-)b/emulators/xenia/files/patch-src_xenia_gpu_d3d12_premake5.lua (+24 lines)
Added Link Here
1
--- src/xenia/gpu/d3d12/premake5.lua.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/gpu/d3d12/premake5.lua
3
@@ -46,8 +46,8 @@ project("xenia-gpu-d3d12-trace-viewer")
4
     "dxbc",
5
     "fmt",
6
     "imgui",
7
-    "libavcodec",
8
-    "libavutil",
9
+    "avcodec",
10
+    "avutil",
11
     "mspack",
12
     "snappy",
13
     "xxhash",
14
@@ -93,8 +93,8 @@ project("xenia-gpu-d3d12-trace-dump")
15
     "dxbc",
16
     "fmt",
17
     "imgui",
18
-    "libavcodec",
19
-    "libavutil",
20
+    "avcodec",
21
+    "avutil",
22
     "mspack",
23
     "snappy",
24
     "xxhash",
(-)b/emulators/xenia/files/patch-src_xenia_gpu_vulkan_premake5.lua (+24 lines)
Added Link Here
1
--- src/xenia/gpu/vulkan/premake5.lua.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/gpu/vulkan/premake5.lua
3
@@ -52,8 +52,8 @@ project("xenia-gpu-vulkan-trace-viewer")
4
     "fmt",
5
     "glslang-spirv",
6
     "imgui",
7
-    "libavcodec",
8
-    "libavutil",
9
+    "avcodec",
10
+    "avutil",
11
     "mspack",
12
     "snappy",
13
     "spirv-tools",
14
@@ -121,8 +121,8 @@ project("xenia-gpu-vulkan-trace-dump")
15
     "fmt",
16
     "glslang-spirv",
17
     "imgui",
18
-    "libavcodec",
19
-    "libavutil",
20
+    "avcodec",
21
+    "avutil",
22
     "mspack",
23
     "snappy",
24
     "spirv-tools",
(-)b/emulators/xenia/files/patch-src_xenia_kernel_xam_xam__net.cc (+11 lines)
Added Link Here
1
--- src/xenia/kernel/xam/xam_net.cc.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/kernel/xam/xam_net.cc
3
@@ -26,7 +26,7 @@
4
 // NOTE: must be included last as it expects windows.h to already be included.
5
 #define _WINSOCK_DEPRECATED_NO_WARNINGS  // inet_addr
6
 #include <winsock2.h>                    // NOLINT(build/include_order)
7
-#elif XE_PLATFORM_LINUX
8
+#elif XE_PLATFORM_LINUX || XE_PLATFORM_FREEBSD
9
 #include <arpa/inet.h>
10
 #include <netinet/in.h>
11
 #include <netinet/ip.h>
(-)b/emulators/xenia/files/patch-src_xenia_kernel_xboxkrnl_xboxkrnl__strings.cc (+179 lines)
Added Link Here
1
--- src/xenia/kernel/xboxkrnl/xboxkrnl_strings.cc.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/kernel/xboxkrnl/xboxkrnl_strings.cc
3
@@ -117,8 +117,8 @@ int32_t format_core(PPCContext* ppc_context, FormatDat
4
                     const bool wide) {
5
   int32_t count = 0;
6
 
7
-  char work8[512];
8
-  char16_t work16[4];
9
+  char work[512];
10
+  wchar_t wwork[4];
11
 
12
   struct {
13
     const void* buffer;
14
@@ -339,13 +339,13 @@ int32_t format_core(PPCContext* ppc_context, FormatDat
15
             auto value = args.get32();
16
 
17
             if (!is_wide) {
18
-              work8[0] = (uint8_t)value;
19
-              text.buffer = &work8[0];
20
+              work[0] = (uint8_t)value;
21
+              text.buffer = &work[0];
22
               text.length = 1;
23
               text.is_wide = false;
24
             } else {
25
-              work16[0] = (uint16_t)value;
26
-              text.buffer = &work16[0];
27
+              wwork[0] = (uint16_t)value;
28
+              text.buffer = &wwork[0];
29
               text.length = 1;
30
               text.is_wide = true;
31
               text.swap_wide = false;
32
@@ -378,7 +378,7 @@ int32_t format_core(PPCContext* ppc_context, FormatDat
33
             }
34
 
35
             if (precision >= 0) {
36
-              precision = std::min(precision, (int32_t)xe::countof(work8));
37
+              precision = std::min(precision, (int32_t)xe::countof(work));
38
             } else {
39
               precision = 1;
40
             }
41
@@ -396,7 +396,7 @@ int32_t format_core(PPCContext* ppc_context, FormatDat
42
               prefix.length = 0;
43
             }
44
 
45
-            char* end = &work8[xe::countof(work8) - 1];
46
+            char* end = &work[xe::countof(work) - 1];
47
             char* start = end;
48
             start[0] = '\0';
49
 
50
@@ -471,9 +471,9 @@ int32_t format_core(PPCContext* ppc_context, FormatDat
51
 
52
             auto s = format_double(value, precision, c, flags);
53
             auto length = (int32_t)s.size();
54
-            assert_true(length < xe::countof(work8));
55
+            assert_true(length < xe::countof(work));
56
 
57
-            auto start = &work8[0];
58
+            auto start = &work[0];
59
             auto end = &start[length];
60
 
61
             std::memcpy(start, s.c_str(), length);
62
@@ -637,7 +637,7 @@ int32_t format_core(PPCContext* ppc_context, FormatDat
63
         }
64
       }
65
     } else {
66
-      // it's a const char16_t*
67
+      // it's a const wchar_t*
68
       auto b = (const uint16_t*)text.buffer;
69
       if (text.swap_wide) {
70
         while (remaining-- > 0) {
71
@@ -768,15 +768,15 @@ class WideStringFormatData : public FormatData {
72
   }
73
 
74
   bool put(uint16_t c) {
75
-    output_ << (char16_t)c;
76
+    output_ << (wchar_t)c;
77
     return true;
78
   }
79
 
80
-  std::u16string wstr() const { return output_.str(); }
81
+  std::wstring wstr() const { return output_.str(); }
82
 
83
  private:
84
   const uint16_t* input_;
85
-  std::basic_stringstream<char16_t> output_;
86
+  std::wostringstream output_;
87
 };
88
 
89
 class WideCountFormatData : public FormatData {
90
@@ -830,7 +830,7 @@ SHIM_CALL DbgPrint_shim(PPCContext* ppc_context, Kerne
91
     return;
92
   }
93
 
94
-  XELOGD("(DbgPrint) {}", data.str());
95
+  XELOGD("(DbgPrint) %s", data.str().c_str());
96
 
97
   SHIM_SET_RETURN_32(X_STATUS_SUCCESS);
98
 }
99
@@ -841,7 +841,7 @@ SHIM_CALL _snprintf_shim(PPCContext* ppc_context, Kern
100
   int32_t buffer_count = SHIM_GET_ARG_32(1);
101
   uint32_t format_ptr = SHIM_GET_ARG_32(2);
102
 
103
-  XELOGD("_snprintf({:08X}, {}, {:08X}, ...)", buffer_ptr, buffer_count,
104
+  XELOGD("_snprintf(%08X, %i, %08X, ...)", buffer_ptr, buffer_count,
105
          format_ptr);
106
 
107
   if (buffer_ptr == 0 || buffer_count <= 0 || format_ptr == 0) {
108
@@ -877,7 +877,7 @@ SHIM_CALL sprintf_shim(PPCContext* ppc_context, Kernel
109
   uint32_t buffer_ptr = SHIM_GET_ARG_32(0);
110
   uint32_t format_ptr = SHIM_GET_ARG_32(1);
111
 
112
-  XELOGD("sprintf({:08X}, {:08X}, ...)", buffer_ptr, format_ptr);
113
+  XELOGD("sprintf(%08X, %08X, ...)", buffer_ptr, format_ptr);
114
 
115
   if (buffer_ptr == 0 || format_ptr == 0) {
116
     SHIM_SET_RETURN_32(-1);
117
@@ -906,7 +906,7 @@ SHIM_CALL _snwprintf_shim(PPCContext* ppc_context, Ker
118
   int32_t buffer_count = SHIM_GET_ARG_32(1);
119
   uint32_t format_ptr = SHIM_GET_ARG_32(2);
120
 
121
-  XELOGD("_snwprintf({:08X}, {}, {:08X}, ...)", buffer_ptr, buffer_count,
122
+  XELOGD("_snwprintf(%08X, %i, %08X, ...)", buffer_ptr, buffer_count,
123
          format_ptr);
124
 
125
   if (buffer_ptr == 0 || buffer_count <= 0 || format_ptr == 0) {
126
@@ -942,7 +942,7 @@ SHIM_CALL swprintf_shim(PPCContext* ppc_context, Kerne
127
   uint32_t buffer_ptr = SHIM_GET_ARG_32(0);
128
   uint32_t format_ptr = SHIM_GET_ARG_32(1);
129
 
130
-  XELOGD("swprintf({:08X}, {:08X}, ...)", buffer_ptr, format_ptr);
131
+  XELOGD("swprintf(%08X, %08X, ...)", buffer_ptr, format_ptr);
132
 
133
   if (buffer_ptr == 0 || format_ptr == 0) {
134
     SHIM_SET_RETURN_32(-1);
135
@@ -972,7 +972,7 @@ SHIM_CALL _vsnprintf_shim(PPCContext* ppc_context, Ker
136
   uint32_t format_ptr = SHIM_GET_ARG_32(2);
137
   uint32_t arg_ptr = SHIM_GET_ARG_32(3);
138
 
139
-  XELOGD("_vsnprintf({:08X}, {}, {:08X}, {:08X})", buffer_ptr, buffer_count,
140
+  XELOGD("_vsnprintf(%08X, %i, %08X, %08X)", buffer_ptr, buffer_count,
141
          format_ptr, arg_ptr);
142
 
143
   if (buffer_ptr == 0 || buffer_count <= 0 || format_ptr == 0) {
144
@@ -1012,7 +1012,7 @@ SHIM_CALL _vsnwprintf_shim(PPCContext* ppc_context, Ke
145
   uint32_t format_ptr = SHIM_GET_ARG_32(2);
146
   uint32_t arg_ptr = SHIM_GET_ARG_32(3);
147
 
148
-  XELOGD("_vsnwprintf({:08X}, {}, {:08X}, {:08X})", buffer_ptr, buffer_count,
149
+  XELOGD("_vsnwprintf(%08X, %i, %08X, %08X)", buffer_ptr, buffer_count,
150
          format_ptr, arg_ptr);
151
 
152
   if (buffer_ptr == 0 || buffer_count <= 0 || format_ptr == 0) {
153
@@ -1051,7 +1051,7 @@ SHIM_CALL vsprintf_shim(PPCContext* ppc_context, Kerne
154
   uint32_t format_ptr = SHIM_GET_ARG_32(1);
155
   uint32_t arg_ptr = SHIM_GET_ARG_32(2);
156
 
157
-  XELOGD("vsprintf({:08X}, {:08X}, {:08X})", buffer_ptr, format_ptr, arg_ptr);
158
+  XELOGD("vsprintf(%08X, %08X, %08X)", buffer_ptr, format_ptr, arg_ptr);
159
 
160
   if (buffer_ptr == 0 || format_ptr == 0) {
161
     SHIM_SET_RETURN_32(-1);
162
@@ -1079,7 +1079,7 @@ SHIM_CALL _vscwprintf_shim(PPCContext* ppc_context, Ke
163
   uint32_t format_ptr = SHIM_GET_ARG_32(0);
164
   uint32_t arg_ptr = SHIM_GET_ARG_32(1);
165
 
166
-  XELOGD("_vscwprintf({:08X}, {:08X})", format_ptr, arg_ptr);
167
+  XELOGD("_vscwprintf(%08X, %08X)", format_ptr, arg_ptr);
168
 
169
   if (format_ptr == 0) {
170
     SHIM_SET_RETURN_32(-1);
171
@@ -1102,7 +1102,7 @@ SHIM_CALL vswprintf_shim(PPCContext* ppc_context, Kern
172
   uint32_t format_ptr = SHIM_GET_ARG_32(1);
173
   uint32_t arg_ptr = SHIM_GET_ARG_32(2);
174
 
175
-  XELOGD("vswprintf({:08X}, {:08X}, {:08X})", buffer_ptr, format_ptr, arg_ptr);
176
+  XELOGD("vswprintf(%08X, %08X, %08X)", buffer_ptr, format_ptr, arg_ptr);
177
 
178
   if (buffer_ptr == 0 || format_ptr == 0) {
179
     SHIM_SET_RETURN_32(-1);
(-)b/emulators/xenia/files/patch-src_xenia_kernel_xsocket.cc (+39 lines)
Added Link Here
1
--- src/xenia/kernel/xsocket.cc.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/kernel/xsocket.cc
3
@@ -44,9 +44,9 @@ X_STATUS XSocket::Initialize(AddressFamily af, Type ty
4
   type_ = type;
5
   proto_ = proto;
6
 
7
-  if (proto == Protocol::IPPROTO_VDP) {
8
+  if (proto == Protocol::IPPROTO_VDP_CXX) {
9
     // VDP is a layer on top of UDP.
10
-    proto = Protocol::IPPROTO_UDP;
11
+    proto = Protocol::IPPROTO_UDP_CXX;
12
   }
13
 
14
   native_handle_ = socket(af, type, proto);
15
@@ -60,7 +60,7 @@ X_STATUS XSocket::Initialize(AddressFamily af, Type ty
16
 X_STATUS XSocket::Close() {
17
 #if XE_PLATFORM_WIN32
18
   int ret = closesocket(native_handle_);
19
-#elif XE_PLATFORM_LINUX
20
+#elif XE_PLATFORM_LINUX || XE_PLATFORM_FREEBSD
21
   int ret = close(native_handle_);
22
 #endif
23
 
24
@@ -103,7 +103,7 @@ X_STATUS XSocket::IOControl(uint32_t cmd, uint8_t* arg
25
   }
26
 
27
   return X_STATUS_SUCCESS;
28
-#elif XE_PLATFORM_LINUX
29
+#elif XE_PLATFORM_LINUX || XE_PLATFORM_FREEBSD
30
   return X_STATUS_UNSUCCESSFUL;
31
 #endif
32
 }
33
@@ -256,4 +256,4 @@ bool XSocket::QueuePacket(uint32_t src_ip, uint16_t sr
34
 }
35
 
36
 }  // namespace kernel
37
-}  // namespace xe
38
\ No newline at end of file
39
+}  // namespace xe
(-)b/emulators/xenia/files/patch-src_xenia_kernel_xsocket.h (+26 lines)
Added Link Here
1
--- src/xenia/kernel/xsocket.h.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/kernel/xsocket.h
3
@@ -78,13 +78,13 @@ class XSocket : public XObject {
4
   };
5
 
6
   enum Protocol {
7
-    IPPROTO_TCP = 6,
8
-    IPPROTO_UDP = 17,
9
+    IPPROTO_TCP_CXX = 6,
10
+    IPPROTO_UDP_CXX = 17,
11
 
12
     // LIVE Voice and Data Protocol
13
     // https://blog.csdn.net/baozi3026/article/details/4277227
14
     // Format: [cbGameData][GameData(encrypted)][VoiceData(unencrypted)]
15
-    IPPROTO_VDP = 254,
16
+    IPPROTO_VDP_CXX = 254,
17
   };
18
 
19
   XSocket(KernelState* kernel_state);
20
@@ -149,4 +149,4 @@ class XSocket : public XObject {
21
 }  // namespace kernel
22
 }  // namespace xe
23
 
24
-#endif  // XENIA_KERNEL_XSOCKET_H_
25
\ No newline at end of file
26
+#endif  // XENIA_KERNEL_XSOCKET_H_
(-)b/emulators/xenia/files/patch-src_xenia_ui_vulkan_vulkan.h (+11 lines)
Added Link Here
1
--- src/xenia/ui/vulkan/vulkan.h.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/ui/vulkan/vulkan.h
3
@@ -14,6 +14,8 @@
4
 
5
 #if XE_PLATFORM_WIN32
6
 #define VK_USE_PLATFORM_WIN32_KHR 1
7
+#elif XE_PLATFORM_FREEBSD
8
+#define VK_USE_PLATFORM_XCB_KHR 1
9
 #elif XE_PLATFORM_LINUX
10
 #define VK_USE_PLATFORM_XCB_KHR 1
11
 #else
(-)b/emulators/xenia/files/patch-src_xenia_ui_vulkan_vulkan__context.cc (+20 lines)
Added Link Here
1
--- src/xenia/ui/vulkan/vulkan_context.cc.orig	2021-06-09 19:56:36 UTC
2
+++ src/xenia/ui/vulkan/vulkan_context.cc
3
@@ -25,7 +25,7 @@
4
 #include "xenia/ui/vulkan/vulkan_util.h"
5
 #include "xenia/ui/window.h"
6
 
7
-#if XE_PLATFORM_LINUX
8
+#if XE_PLATFORM_LINUX || XE_PLATFORM_FREEBSD
9
 #include "xenia/ui/window_gtk.h"
10
 
11
 #include <X11/Xlib-xcb.h>
12
@@ -69,7 +69,7 @@ bool VulkanContext::Initialize() {
13
     status = vkCreateWin32SurfaceKHR(*provider->instance(), &create_info,
14
                                      nullptr, &surface);
15
     CheckResult(status, "vkCreateWin32SurfaceKHR");
16
-#elif XE_PLATFORM_LINUX
17
+#elif XE_PLATFORM_LINUX || XE_PLATFORM_FREEBSD
18
 #ifdef GDK_WINDOWING_X11
19
     GtkWidget* window_handle =
20
         static_cast<GtkWidget*>(target_window_->native_handle());
(-)b/emulators/xenia/files/patch-third__party_cpptoml_include_cpptoml.h (+51 lines)
Added Link Here
1
--- third_party/cpptoml/include/cpptoml.h.orig	2018-10-22 20:28:28 UTC
2
+++ third_party/cpptoml/include/cpptoml.h
3
@@ -12,7 +12,7 @@
4
 #include <clocale>
5
 #include <cstdint>
6
 #include <cstring>
7
-#include <fstream>
8
+#include <boost/nowide/fstream.hpp>
9
 #include <iomanip>
10
 #include <map>
11
 #include <memory>
12
@@ -188,8 +188,7 @@ inline std::ostream& operator<<(std::ostream& os, cons
13
     fill_guard g{os};
14
     os.fill('0');
15
 
16
-    using std::setw;
17
-    os << setw(4) << dt.year << "-" << setw(2) << dt.month << "-" << setw(2)
18
+    os << std::setw(4) << dt.year << "-" << std::setw(2) << dt.month << "-" << std::setw(2)
19
        << dt.day;
20
 
21
     return os;
22
@@ -200,9 +199,8 @@ inline std::ostream& operator<<(std::ostream& os, cons
23
     fill_guard g{os};
24
     os.fill('0');
25
 
26
-    using std::setw;
27
-    os << setw(2) << ltime.hour << ":" << setw(2) << ltime.minute << ":"
28
-       << setw(2) << ltime.second;
29
+    os << std::setw(2) << ltime.hour << ":" << std::setw(2) << ltime.minute << ":"
30
+       << std::setw(2) << ltime.second;
31
 
32
     if (ltime.microsecond > 0)
33
     {
34
@@ -224,8 +222,6 @@ inline std::ostream& operator<<(std::ostream& os, cons
35
     fill_guard g{os};
36
     os.fill('0');
37
 
38
-    using std::setw;
39
-
40
     if (zo.hour_offset != 0 || zo.minute_offset != 0)
41
     {
42
         if (zo.hour_offset > 0)
43
@@ -236,7 +232,7 @@ inline std::ostream& operator<<(std::ostream& os, cons
44
         {
45
             os << "-";
46
         }
47
-        os << setw(2) << std::abs(zo.hour_offset) << ":" << setw(2)
48
+        os << std::setw(2) << std::abs(zo.hour_offset) << ":" << std::setw(2)
49
            << std::abs(zo.minute_offset);
50
     }
51
     else
(-)b/emulators/xenia/files/patch-third__party_crypto_sha256.cpp (+18 lines)
Added Link Here
1
--- third_party/crypto/sha256.cpp.orig	2021-06-09 19:56:36 UTC
2
+++ third_party/crypto/sha256.cpp
3
@@ -9,7 +9,7 @@
4
 
5
 // big endian architectures need #define __BYTE_ORDER __BIG_ENDIAN
6
 #ifndef _MSC_VER
7
-#include <endian.h>
8
+#include <sys/endian.h>
9
 #endif
10
 
11
 namespace sha256 {
12
@@ -573,4 +573,4 @@ std::string SHA256::operator()(const std::string& text
13
   return getHash();
14
 }
15
 
16
-}
17
\ No newline at end of file
18
+}
(-)b/emulators/xenia/files/patch-third__party_microprofile_microprofile.h (+11 lines)
Added Link Here
1
--- third_party/microprofile/microprofile.h.orig	2021-06-09 19:56:36 UTC
2
+++ third_party/microprofile/microprofile.h
3
@@ -242,7 +242,7 @@ typedef uint32_t MicroProfileThreadIdType;
4
 #define MP_GETCURRENTPROCESSID() GetCurrentProcessId()
5
 typedef uint32_t MicroProfileProcessIdType;
6
 
7
-#elif defined(__linux__)
8
+#elif defined(__linux__) || defined(__FreeBSD__)
9
 #include <unistd.h>
10
 #include <time.h>
11
 inline int64_t MicroProfileTicksPerSecondCpu()
(-)b/emulators/xenia/files/patch-third__party_premake-core_src_tools_gcc.lua (+22 lines)
Added Link Here
1
--- third_party/premake-core/src/tools/gcc.lua.orig	2020-11-27 20:23:57 UTC
2
+++ third_party/premake-core/src/tools/gcc.lua
3
@@ -516,9 +516,17 @@
4
 					table.insert(static_syslibs, "-l" .. name)
5
 				elseif endswith(name, ":shared") then
6
 					name = string.sub(name, 0, -8)
7
-					table.insert(shared_syslibs, "-l" .. name)
8
+					if string.len(name) > 0 then
9
+						table.insert(shared_syslibs, "-l" .. name)
10
+					else
11
+						table.insert(shared_syslibs, "" .. name)
12
+					end
13
 				else
14
-					table.insert(shared_syslibs, "-l" .. name)
15
+					if string.len(name) > 0 then
16
+						table.insert(shared_syslibs, "-l" .. name)
17
+					else
18
+						table.insert(shared_syslibs, "" .. name)
19
+					end
20
 				end
21
 			end
22
 		end
(-)b/emulators/xenia/files/patch-third__party_renderdoc_renderdoc__app.h (+11 lines)
Added Link Here
1
--- third_party/renderdoc/renderdoc_app.h.orig	2021-06-09 19:56:36 UTC
2
+++ third_party/renderdoc/renderdoc_app.h
3
@@ -30,7 +30,7 @@
4
 
5
 #if defined(WIN32)
6
 	#define RENDERDOC_CC __cdecl
7
-#elif defined(__linux__)
8
+#elif defined(__linux__) || defined(__FreeBSD__)
9
 	#define RENDERDOC_CC
10
 #else
11
 	#error "Unknown platform"
(-)b/emulators/xenia/pkg-descr (+5 lines)
Added Link Here
1
Xenia - Xbox 360 Emulator
2
3
Xenia is an experimental emulator for the Xbox 360.
4
5
WWW: https://github.com/xenia-project/xenia

Return to bug 257175