Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:ahmedmoselhi2:branches:Emulators
xenia-canary
xenia-canary_PR198.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xenia-canary_PR198.patch of Package xenia-canary
From 6c471d47987fc9944cf58df230d257d7a07e3842 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Wed, 17 May 2023 17:14:39 +0200 Subject: [PATCH 01/16] Initial linux wip --- premake5.lua | 13 +++- src/xenia/app/emulator_window.cc | 17 +++-- src/xenia/apu/conversion.h | 4 +- src/xenia/apu/xma_context.cc | 4 ++ src/xenia/base/clock_posix.cc | 5 ++ src/xenia/base/demangle.h | 19 ++++++ src/xenia/base/demangle_posix.cc | 26 +++++++ src/xenia/base/demangle_win.cc | 16 +++++ src/xenia/base/filesystem_posix.cc | 59 +++++++++------- src/xenia/base/memory.cc | 16 ++++- src/xenia/base/memory.h | 7 ++ src/xenia/base/memory_posix.cc | 10 ++- src/xenia/base/platform.h | 2 +- src/xenia/base/platform_amd64.cc | 1 + src/xenia/base/platform_linux.h | 23 +++++++ src/xenia/base/premake5.lua | 2 +- src/xenia/base/string_buffer.cc | 14 ++-- src/xenia/base/system_gnulinux.cc | 2 +- src/xenia/base/testing/filesystem_test.cc | 58 ++++++++++++++++ src/xenia/base/testing/memory_test.cc | 2 +- src/xenia/base/testing/premake5.lua | 7 ++ src/xenia/base/testing/res/test_file | 1 + src/xenia/base/testing/string_test.cc | 34 ++++++++++ src/xenia/cpu/backend/x64/x64_backend.cc | 44 ++++++------ src/xenia/cpu/backend/x64/x64_emitter.cc | 50 ++++++++++---- src/xenia/cpu/backend/x64/x64_emitter.h | 12 ++++ src/xenia/cpu/backend/x64/x64_tracers.cc | 2 +- src/xenia/cpu/backend/x64/x64_tracers.h | 2 +- src/xenia/cpu/hir/value.cc | 2 +- src/xenia/cpu/hir/value.h | 1 + src/xenia/cpu/ppc/ppc_context.h | 4 +- src/xenia/cpu/ppc/ppc_frontend.cc | 8 +-- src/xenia/cpu/ppc/ppc_translator.cc | 4 ++ src/xenia/cpu/testing/util.h | 1 - src/xenia/cpu/xex_module.cc | 4 ++ src/xenia/gpu/command_processor.h | 4 +- src/xenia/gpu/draw_util.cc | 7 ++ src/xenia/gpu/draw_util.h | 8 +-- src/xenia/gpu/pm4_command_processor_declare.h | 68 +++++++++---------- .../gpu/pm4_command_processor_implement.h | 66 +++++++++--------- src/xenia/gpu/register_file.cc | 1 + src/xenia/gpu/shared_memory.cc | 3 +- src/xenia/kernel/achievement_manager.cc | 6 +- src/xenia/kernel/premake5.lua | 3 + src/xenia/kernel/util/object_table.cc | 7 +- src/xenia/kernel/xam/xam_info.cc | 2 + src/xenia/kernel/xobject.cc | 10 +-- src/xenia/kernel/xsocket.cc | 5 ++ src/xenia/memory.cc | 2 +- src/xenia/memory.h | 2 +- src/xenia/ui/imgui_notification.cc | 24 +++++++ xenia-build | 5 +- 52 files changed, 523 insertions(+), 176 deletions(-) create mode 100644 src/xenia/base/demangle.h create mode 100644 src/xenia/base/demangle_posix.cc create mode 100644 src/xenia/base/demangle_win.cc create mode 100644 src/xenia/base/testing/filesystem_test.cc create mode 100644 src/xenia/base/testing/res/test_file create mode 100644 src/xenia/base/testing/string_test.cc diff --git a/premake5.lua b/premake5.lua index 71efb4a85d..f547d867cf 100644 --- a/premake5.lua +++ b/premake5.lua @@ -100,6 +100,10 @@ filter("configurations:Release") -- including handling of specials since games make assumptions about them. filter("platforms:Linux") system("linux") +-- Ccache seems to randomly break the build process, disable it + defines({ + "CCACHE_DISABLE=1" + }) toolset("clang") buildoptions({ -- "-mlzcnt", -- (don't) Assume lzcnt is supported. @@ -135,8 +139,15 @@ filter({"platforms:Linux", "toolset:gcc"}) filter({"platforms:Linux", "language:C++", "toolset:clang"}) disablewarnings({ - "deprecated-register" + "deprecated-register", + "attributes" + }) + removeflags({ + "FatalWarnings" }) + --buildoptions({ + -- "-fpermissive" + --}) filter({"platforms:Linux", "language:C++", "toolset:clang", "files:*.cc or *.cpp"}) buildoptions({ "-stdlib=libstdc++", diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index 90257d45d0..c4c3e4155c 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -31,7 +31,9 @@ #include "xenia/cpu/processor.h" #include "xenia/emulator.h" #include "xenia/gpu/command_processor.h" +#ifdef XE_PLATFORM_WINDOWS #include "xenia/gpu/d3d12/d3d12_command_processor.h" +#endif #include "xenia/gpu/graphics_system.h" #include "xenia/hid/input_system.h" #include "xenia/ui/file_picker.h" @@ -1255,11 +1257,12 @@ EmulatorWindow::ControllerHotKey EmulatorWindow::ProcessControllerHotkey( case ButtonFunctions::ClearMemoryPageState: ToggleGPUSetting(gpu_cvar::ClearMemoryPageState); +#ifdef XE_PLATFORM_WINDOWS // Assume the user wants ClearCaches as well if (cvars::d3d12_clear_memory_page_state) { GpuClearCaches(); } - +#endif // Extra Sleep xe::threading::Sleep(delay); break; @@ -1385,6 +1388,7 @@ void EmulatorWindow::GamepadHotKeys() { } void EmulatorWindow::ToggleGPUSetting(gpu_cvar value) { +#ifdef XE_PLATFORM_WINDOWS switch (value) { case gpu_cvar::ClearMemoryPageState: D3D12SaveGPUSetting(D3D12GPUSetting::ClearMemoryPageState, @@ -1395,6 +1399,7 @@ void EmulatorWindow::ToggleGPUSetting(gpu_cvar value) { !cvars::d3d12_readback_resolve); break; } +#endif } // Determine if the Xbox Gamebar is enabled via the Windows registry @@ -1431,7 +1436,11 @@ void EmulatorWindow::DisplayHotKeysConfig() { if (!guide_enabled) { pretty_text = std::regex_replace( pretty_text, +#ifdef XE_PLATFORM_WINDOWS std::regex("Guide", std::regex_constants::syntax_option_type::icase), +#else + std::regex("Guide", std::regex_constants::icase), +#endif "Back"); } @@ -1457,14 +1466,14 @@ void EmulatorWindow::DisplayHotKeysConfig() { msg_passthru += "\n"; msg.insert(0, msg_passthru); msg += "\n"; - +#ifdef XE_PLATFORM_WINDOWS msg += "Readback Resolve: " + BoolToString(cvars::d3d12_readback_resolve); msg += "\n"; msg += "Clear Memory Page State: " + BoolToString(cvars::d3d12_clear_memory_page_state); msg += "\n"; - +#endif msg += "Controller Hotkeys: " + BoolToString(cvars::controller_hotkeys); imgui_drawer_.get()->ClearDialogs(); @@ -1476,7 +1485,7 @@ xe::X_STATUS EmulatorWindow::RunTitle(std::filesystem::path path_to_file) { bool titleExists = !std::filesystem::exists(path_to_file); if (path_to_file.empty() || titleExists) { - char* log_msg = path_to_file.empty() + const char* log_msg = path_to_file.empty() ? "Failed to launch title path is empty." : "Failed to launch title path is invalid."; diff --git a/src/xenia/apu/conversion.h b/src/xenia/apu/conversion.h index 672a6e0c65..7318c54290 100644 --- a/src/xenia/apu/conversion.h +++ b/src/xenia/apu/conversion.h @@ -36,8 +36,10 @@ static void _generic_sequential_6_BE_to_interleaved_6_LE( } } } -#if XE_COMPILER_CLANG_CL != 1 +#if XE_COMPILER_CLANG_CL != 1 && !XE_PLATFORM_LINUX // load_be_u32 unavailable on clang-cl +// TODO(RodoMa92): Reimplement _load_be_u32 with __builtin_bswap32 from +// GCC, which seems the closest candidate as an equivalent call XE_NOINLINE static void _movbe_sequential_6_BE_to_interleaved_6_LE( float* XE_RESTRICT output, const float* XE_RESTRICT input, diff --git a/src/xenia/apu/xma_context.cc b/src/xenia/apu/xma_context.cc index a619e8b31e..d6473807e0 100644 --- a/src/xenia/apu/xma_context.cc +++ b/src/xenia/apu/xma_context.cc @@ -691,6 +691,10 @@ void XmaContext::Decode(XMA_CONTEXT_DATA* data) { data->output_buffer_write_offset = output_rb.write_offset() / 256; total_samples += id_ == 0 ? kSamplesPerFrame : 0; +//FIXME(RodoMa92): Linux errors out with undef ref to kBitsPerHeader, for whatever reason +#ifdef XE_PLATFORM_LINUX + static const uint32_t kBitsPerHeader = 32; +#endif uint32_t offset = std::max(kBitsPerHeader, data->input_buffer_read_offset); diff --git a/src/xenia/base/clock_posix.cc b/src/xenia/base/clock_posix.cc index 73a23dc760..c0ebc2ada9 100644 --- a/src/xenia/base/clock_posix.cc +++ b/src/xenia/base/clock_posix.cc @@ -9,6 +9,7 @@ #include <sys/time.h> +#include "platform_linux.h" #include "xenia/base/assert.h" #include "xenia/base/clock.h" @@ -53,4 +54,8 @@ uint64_t Clock::QueryHostUptimeMillis() { return host_tick_count_platform() * 1000 / host_tick_frequency_platform(); } +uint64_t Clock::QueryHostInterruptTime() { + return *reinterpret_cast<uint64_t*>(KUserShared() + + KUSER_SHARED_INTERRUPTTIME_OFFSET); +} } // namespace xe diff --git a/src/xenia/base/demangle.h b/src/xenia/base/demangle.h new file mode 100644 index 0000000000..6fbdab9a9e --- /dev/null +++ b/src/xenia/base/demangle.h @@ -0,0 +1,19 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2020 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_BASE_DEMANGLE_H_ +#define XENIA_BASE_DEMANGLE_H_ + +#include <string> + +namespace xe { +std::string Demangle(const std::string& mangled_name); +} + +#endif // XENIA_BASE_DEMANGLE_H_ diff --git a/src/xenia/base/demangle_posix.cc b/src/xenia/base/demangle_posix.cc new file mode 100644 index 0000000000..4e50e3dbb7 --- /dev/null +++ b/src/xenia/base/demangle_posix.cc @@ -0,0 +1,26 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2020 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/base/demangle.h" + +#include <cxxabi.h> +#include <memory> + +namespace xe { + +std::string Demangle(const std::string& mangled_name) { + std::size_t len = 0; + int status = 0; + std::unique_ptr<char, decltype(&std::free)> ptr( + __cxxabiv1::__cxa_demangle(mangled_name.c_str(), nullptr, &len, &status), + &std::free); + return ptr ? std::string("class ") + ptr.get() : ""; +} + +} // namespace xe diff --git a/src/xenia/base/demangle_win.cc b/src/xenia/base/demangle_win.cc new file mode 100644 index 0000000000..84a46a437e --- /dev/null +++ b/src/xenia/base/demangle_win.cc @@ -0,0 +1,16 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2020 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/base/demangle.h" + +namespace xe { + +std::string Demangle(const std::string& name) { return name; } + +} // namespace xe diff --git a/src/xenia/base/filesystem_posix.cc b/src/xenia/base/filesystem_posix.cc index 2e9ddb2c5b..34b186a810 100644 --- a/src/xenia/base/filesystem_posix.cc +++ b/src/xenia/base/filesystem_posix.cc @@ -9,21 +9,18 @@ #include "xenia/base/assert.h" #include "xenia/base/filesystem.h" -#include "xenia/base/logging.h" #include "xenia/base/string.h" -#include <assert.h> #include <dirent.h> #include <fcntl.h> #include <ftw.h> -#include <libgen.h> #include <pwd.h> -#include <stdio.h> -#include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> -#include <iostream> +#include <cstdio> +#include <cstdlib> +#include <cstring> namespace xe { @@ -65,12 +62,12 @@ std::filesystem::path GetUserFolder() { home = std::getenv("HOME"); // if HOME not set, fall back to this - if (home == NULL) { + if (home == nullptr) { struct passwd pw1; struct passwd* pw; - char buf[4096]; // could potentionally lower this + char buf[4096]; // could potentially lower this getpwuid_r(getuid(), &pw1, buf, sizeof(buf), &pw); - assert(&pw1 == pw); // sanity check + assert_true(&pw1 == pw); // sanity check home = pw->pw_dir; } @@ -112,13 +109,14 @@ static int removeCallback(const char* fpath, const struct stat* sb, return rv; } -static uint64_t convertUnixtimeToWinFiletime(time_t unixtime) { - // Linux uses number of seconds since 1/1/1970, and Windows uses +static uint64_t convertUnixtimeToWinFiletime(const timespec& unixtime) { + // Linux uses number of nanoseconds since 1/1/1970, and Windows uses // number of nanoseconds since 1/1/1601 - // so we convert linux time to nanoseconds and then add the number of - // nanoseconds from 1601 to 1970 + // so we add the number of nanoseconds from 1601 to 1970 + // and return in the format of 10ns intervals // see https://msdn.microsoft.com/en-us/library/ms724228 - uint64_t filetime = filetime = (unixtime * 10000000) + 116444736000000000; + uint64_t filetime = (unixtime.tv_sec * 10000000) + unixtime.tv_nsec / 100 + + 116444736000000000; return filetime; } @@ -143,16 +141,16 @@ class PosixFileHandle : public FileHandle { size_t* out_bytes_read) override { ssize_t out = pread(handle_, buffer, buffer_length, file_offset); *out_bytes_read = out; - return out >= 0 ? true : false; + return out >= 0; } bool Write(size_t file_offset, const void* buffer, size_t buffer_length, size_t* out_bytes_written) override { ssize_t out = pwrite(handle_, buffer, buffer_length, file_offset); *out_bytes_written = out; - return out >= 0 ? true : false; + return out >= 0; } bool SetLength(size_t length) override { - return ftruncate(handle_, length) >= 0 ? true : false; + return ftruncate(handle_, length) >= 0; } void Flush() override { fsync(handle_); } @@ -197,12 +195,17 @@ bool GetInfo(const std::filesystem::path& path, FileInfo* out_info) { if (stat(path.c_str(), &st) == 0) { if (S_ISDIR(st.st_mode)) { out_info->type = FileInfo::Type::kDirectory; + // On Linux st.st_size can have non-zero size (generally 4096) so make 0 + out_info->total_size = 0; } else { out_info->type = FileInfo::Type::kFile; + out_info->total_size = st.st_size; } - out_info->create_timestamp = convertUnixtimeToWinFiletime(st.st_ctime); - out_info->access_timestamp = convertUnixtimeToWinFiletime(st.st_atime); - out_info->write_timestamp = convertUnixtimeToWinFiletime(st.st_mtime); + out_info->path = path.parent_path(); + out_info->name = path.filename(); + out_info->create_timestamp = convertUnixtimeToWinFiletime(st.st_ctim); + out_info->access_timestamp = convertUnixtimeToWinFiletime(st.st_atim); + out_info->write_timestamp = convertUnixtimeToWinFiletime(st.st_mtim); return true; } return false; @@ -217,20 +220,26 @@ std::vector<FileInfo> ListFiles(const std::filesystem::path& path) { } while (auto ent = readdir(dir)) { + if (std::strcmp(ent->d_name, ".") == 0 || + std::strcmp(ent->d_name, "..") == 0) { + continue; + } + FileInfo info; info.name = ent->d_name; struct stat st; - stat((path / info.name).c_str(), &st); - info.create_timestamp = convertUnixtimeToWinFiletime(st.st_ctime); - info.access_timestamp = convertUnixtimeToWinFiletime(st.st_atime); - info.write_timestamp = convertUnixtimeToWinFiletime(st.st_mtime); + auto ret = stat((path / info.name).c_str(), &st); + assert_zero(ret); + info.create_timestamp = convertUnixtimeToWinFiletime(st.st_ctim); + info.access_timestamp = convertUnixtimeToWinFiletime(st.st_atim); + info.write_timestamp = convertUnixtimeToWinFiletime(st.st_mtim); if (ent->d_type == DT_DIR) { info.type = FileInfo::Type::kDirectory; info.total_size = 0; } else { info.type = FileInfo::Type::kFile; - info.total_size = st.st_size; + info.total_size = static_cast<size_t>(st.st_size); } result.push_back(info); } diff --git a/src/xenia/base/memory.cc b/src/xenia/base/memory.cc index 4fb5372264..c8fab9ad96 100644 --- a/src/xenia/base/memory.cc +++ b/src/xenia/base/memory.cc @@ -77,6 +77,9 @@ static void XeCopy16384StreamingAVX(CacheLine* XE_RESTRICT to, XE_MSVC_REORDER_BARRIER(); } XE_FORCEINLINE +#ifdef XE_PLATFORM_LINUX +__attribute__((__target__("movdir64b"))) +#endif static void XeCopy16384Movdir64M(CacheLine* XE_RESTRICT to, CacheLine* XE_RESTRICT from) { uint32_t num_lines_for_8k = 4096 / XE_HOST_CACHE_LINE_SIZE; @@ -142,7 +145,9 @@ static void vastcpy_impl_avx(CacheLine* XE_RESTRICT physaddr, xe::swcache::WriteLineNT(physaddr + i, &line0); } } - +#ifdef XE_PLATFORM_LINUX +__attribute__((__target__("movdir64b"))) +#endif static void vastcpy_impl_movdir64m(CacheLine* XE_RESTRICT physaddr, CacheLine* XE_RESTRICT rdmapping, uint32_t written_length) { @@ -176,8 +181,12 @@ static void vastcpy_impl_movdir64m(CacheLine* XE_RESTRICT physaddr, static void vastcpy_impl_repmovs(CacheLine* XE_RESTRICT physaddr, CacheLine* XE_RESTRICT rdmapping, uint32_t written_length) { +#if XE_PLATFORM_WINDOWS __movsq((unsigned long long*)physaddr, (unsigned long long*)rdmapping, written_length / 8); +#else + memcpy(physaddr, rdmapping, written_length); +#endif } XE_COLD static void first_vastcpy(CacheLine* XE_RESTRICT physaddr, @@ -305,6 +314,11 @@ void copy_and_swap_32_aligned(void* dest_ptr, const void* src_ptr, } } + + +#ifdef XE_PLATFORM_LINUX +__attribute__((__target__("avx2"))) +#endif void copy_and_swap_32_unaligned(void* dest_ptr, const void* src_ptr, size_t count) { auto dest = reinterpret_cast<uint32_t*>(dest_ptr); diff --git a/src/xenia/base/memory.h b/src/xenia/base/memory.h index 178d88fb73..e449746574 100644 --- a/src/xenia/base/memory.h +++ b/src/xenia/base/memory.h @@ -701,10 +701,17 @@ static void ReadLineNT(CacheLine* XE_RESTRICT destination, const CacheLine* XE_RESTRICT source) { assert_true((reinterpret_cast<uintptr_t>(source) & 63ULL) == 0); +#ifdef XE_PLATFORM_WINDOWS __m128i first = _mm_stream_load_si128(&source->xmms[0]); __m128i second = _mm_stream_load_si128(&source->xmms[1]); __m128i third = _mm_stream_load_si128(&source->xmms[2]); __m128i fourth = _mm_stream_load_si128(&source->xmms[3]); +#else + __m128i first = _mm_stream_load_si128((__m128i *) &source->xmms[0]); + __m128i second = _mm_stream_load_si128((__m128i *) &source->xmms[1]); + __m128i third = _mm_stream_load_si128((__m128i *) &source->xmms[2]); + __m128i fourth = _mm_stream_load_si128((__m128i *) &source->xmms[3]); +#endif destination->xmms[0] = first; destination->xmms[1] = second; diff --git a/src/xenia/base/memory_posix.cc b/src/xenia/base/memory_posix.cc index 2ff36a603d..d3043bfc2a 100644 --- a/src/xenia/base/memory_posix.cc +++ b/src/xenia/base/memory_posix.cc @@ -85,8 +85,14 @@ void* AllocFixed(void* base_address, size_t length, AllocationType allocation_type, PageAccess access) { // mmap does not support reserve / commit, so ignore allocation_type. uint32_t prot = ToPosixProtectFlags(access); - void* result = mmap(base_address, length, prot, - MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0); + void * result; + if (base_address) { + result = mmap(base_address, length, prot, + MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0); + } else { + result = mmap(base_address, length, prot, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + } if (result == MAP_FAILED) { return nullptr; } else { diff --git a/src/xenia/base/platform.h b/src/xenia/base/platform.h index c258ad08fd..0c7475b580 100644 --- a/src/xenia/base/platform.h +++ b/src/xenia/base/platform.h @@ -166,7 +166,7 @@ #define XE_RESTRICT __restrict #else -#define XE_RESTRICT +#define XE_RESTRICT __restrict__ #endif #if XE_ARCH_AMD64 == 1 diff --git a/src/xenia/base/platform_amd64.cc b/src/xenia/base/platform_amd64.cc index 48b1c6102e..7bced939e7 100644 --- a/src/xenia/base/platform_amd64.cc +++ b/src/xenia/base/platform_amd64.cc @@ -36,6 +36,7 @@ namespace amd64 { static uint64_t g_feature_flags = 0U; static bool g_did_initialize_feature_flags = false; uint64_t GetFeatureFlags() { + InitFeatureFlags(); xenia_assert(g_did_initialize_feature_flags); return g_feature_flags; } diff --git a/src/xenia/base/platform_linux.h b/src/xenia/base/platform_linux.h index ab86caa686..b23719f7f9 100644 --- a/src/xenia/base/platform_linux.h +++ b/src/xenia/base/platform_linux.h @@ -17,4 +17,27 @@ #include "xenia/base/platform.h" +#include <cstdint> +#include <glib.h> + +typedef uint8_t BYTE; +typedef uint32_t DWORD; +typedef int32_t LONG; +typedef int64_t LONGLONG; + +typedef union _LARGE_INTEGER { + struct { + DWORD LowPart; + LONG HighPart; + }; + struct { + DWORD LowPart; + LONG HighPart; + } u; + LONGLONG QuadPart; +} LARGE_INTEGER, *PLARGE_INTEGER; + +static constexpr size_t KUSER_SHARED_INTERRUPTTIME_OFFSET = 8; +static unsigned char* KUserShared() { return (unsigned char*)0x7FFE0000ULL; } + #endif // XENIA_BASE_PLATFORM_LINUX_H_ diff --git a/src/xenia/base/premake5.lua b/src/xenia/base/premake5.lua index d53c34351b..6bec1bf483 100644 --- a/src/xenia/base/premake5.lua +++ b/src/xenia/base/premake5.lua @@ -17,4 +17,4 @@ project("xenia-base") "debug_visualizers.natvis", }) -include("testing") +include("testing") \ No newline at end of file diff --git a/src/xenia/base/string_buffer.cc b/src/xenia/base/string_buffer.cc index b3a9270a81..f94fd6c880 100644 --- a/src/xenia/base/string_buffer.cc +++ b/src/xenia/base/string_buffer.cc @@ -71,13 +71,15 @@ void StringBuffer::Append(const std::string_view value) { } void StringBuffer::AppendVarargs(const char* format, va_list args) { - int result = vsnprintf(nullptr, 0, format, args); - if (result <= 0) { - return; - } - auto length = static_cast<size_t>(result); + va_list size_args; + va_copy(size_args, args); // arg is indeterminate after the return so copy it + int length = vsnprintf(nullptr, 0, format, size_args); + assert_true(length >= 0); + va_end(size_args); Grow(length + 1); - vsnprintf(buffer_ + buffer_offset_, buffer_capacity_, format, args); + int result = vsnprintf(buffer_ + buffer_offset_, + buffer_capacity_ - buffer_offset_, format, args); + assert_true(result == length); buffer_offset_ += length; buffer_[buffer_offset_] = 0; } diff --git a/src/xenia/base/system_gnulinux.cc b/src/xenia/base/system_gnulinux.cc index 920c9ab9e0..403e9b01ff 100644 --- a/src/xenia/base/system_gnulinux.cc +++ b/src/xenia/base/system_gnulinux.cc @@ -9,7 +9,7 @@ #include <alloca.h> #include <dlfcn.h> -#include <stdlib.h> +#include <cstdlib> #include <cstring> diff --git a/src/xenia/base/testing/filesystem_test.cc b/src/xenia/base/testing/filesystem_test.cc new file mode 100644 index 0000000000..2829e6b9d5 --- /dev/null +++ b/src/xenia/base/testing/filesystem_test.cc @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2019 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/base/filesystem.h" + +#include <filesystem> + +#include "third_party/catch/include/catch.hpp" + +namespace xe { +namespace base { +namespace test { + +TEST_CASE("file_get_info", "Get Info") { + auto test_file_name = std::filesystem::path("test_file"); + auto test_file_dir = std::filesystem::path("src/xenia/base/testing/res"); + auto test_file_path = test_file_dir / test_file_name; + + filesystem::FileInfo info = {}; + + REQUIRE(filesystem::GetInfo(test_file_path, &info)); + + CHECK(info.type == filesystem::FileInfo::Type::kFile); + CHECK(info.name == test_file_name); + CHECK(info.path == test_file_dir); + CHECK(info.total_size == 81); + CHECK(info.create_timestamp > 132111406279379842); + CHECK(info.access_timestamp > 132111406279379842); + CHECK(info.write_timestamp > 132111406279379842); +} + +TEST_CASE("folder_get_info", "Get Info") { + auto test_folder_name = std::filesystem::path("res"); + auto test_folder_dir = std::filesystem::path("src/xenia/base/testing"); + auto test_folder_path = test_folder_dir / test_folder_name; + + filesystem::FileInfo info = {}; + + REQUIRE(filesystem::GetInfo(test_folder_path, &info)); + + CHECK(info.type == filesystem::FileInfo::Type::kDirectory); + CHECK(info.name == test_folder_name); + CHECK(info.path == test_folder_dir); + CHECK(info.total_size == 0); + CHECK(info.create_timestamp > 132111406279379842); + CHECK(info.access_timestamp > 132111406279379842); + CHECK(info.write_timestamp > 132111406279379842); +} + +} // namespace test +} // namespace base +} // namespace xe diff --git a/src/xenia/base/testing/memory_test.cc b/src/xenia/base/testing/memory_test.cc index 3f3c1f9639..c670a65a24 100644 --- a/src/xenia/base/testing/memory_test.cc +++ b/src/xenia/base/testing/memory_test.cc @@ -506,7 +506,7 @@ TEST_CASE("copy_and_swap_16_in_32_unaligned", "[copy_and_swap]") { } } -TEST_CASE("create_and_close_file_mapping", "Virtual Memory Mapping") { +TEST_CASE("create_and_close_file_mapping", "[virtual_memory_mapping]") { auto path = fmt::format("xenia_test_{}", Clock::QueryHostTickCount()); auto memory = xe::memory::CreateFileMappingHandle( path, 0x100, xe::memory::PageAccess::kReadWrite, true); diff --git a/src/xenia/base/testing/premake5.lua b/src/xenia/base/testing/premake5.lua index 74d39aa651..61194c98a8 100644 --- a/src/xenia/base/testing/premake5.lua +++ b/src/xenia/base/testing/premake5.lua @@ -7,3 +7,10 @@ test_suite("xenia-base-tests", project_root, ".", { "xenia-base", }, }) + files({ + "res/*", + }) + filter("files:res/*") + flags({"ExcludeFromBuild"}) + filter("platforms:Windows") + debugdir(project_root) \ No newline at end of file diff --git a/src/xenia/base/testing/res/test_file b/src/xenia/base/testing/res/test_file new file mode 100644 index 0000000000..c94444439f --- /dev/null +++ b/src/xenia/base/testing/res/test_file @@ -0,0 +1 @@ +Test file to test the xe::filesystem::GetInfo function on both Windows and Linux diff --git a/src/xenia/base/testing/string_test.cc b/src/xenia/base/testing/string_test.cc new file mode 100644 index 0000000000..654f7d440a --- /dev/null +++ b/src/xenia/base/testing/string_test.cc @@ -0,0 +1,34 @@ +/** +****************************************************************************** +* Xenia : Xbox 360 Emulator Research Project * +****************************************************************************** +* Copyright 2019 Ben Vanik. All rights reserved. * +* Released under the BSD license - see LICENSE in the root for more details. * +****************************************************************************** +*/ + +#include "xenia/base/string.h" +#include "xenia/base/string_buffer.h" + +#include "third_party/catch/include/catch.hpp" + +namespace xe { +namespace base { +namespace test { + +TEST_CASE("StringBuffer") { + StringBuffer sb; + uint32_t module_flags = 0x1000000; + + std::string path_(R"(\Device\Cdrom0\default.xex)"); + sb.AppendFormat("Module {}:\n", path_.c_str()); + REQUIRE(sb.to_string() == "Module \\Device\\Cdrom0\\default.xex:\n"); + sb.AppendFormat(" Module Flags: {:08X}\n", module_flags); + REQUIRE( + sb.to_string() == + "Module \\Device\\Cdrom0\\default.xex:\n Module Flags: 01000000\n"); +} + +} // namespace test +} // namespace base +} // namespace xe diff --git a/src/xenia/cpu/backend/x64/x64_backend.cc b/src/xenia/cpu/backend/x64/x64_backend.cc index 1e1f3fedb2..e05d5d6e7e 100644 --- a/src/xenia/cpu/backend/x64/x64_backend.cc +++ b/src/xenia/cpu/backend/x64/x64_backend.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2019 Ben Vanik. All rights reserved. * + * Copyright 2022 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ @@ -576,9 +576,10 @@ void* X64HelperEmitter::EmitCurrentForOffsets(const _code_offsets& code_offsets, return fn; } HostToGuestThunk X64HelperEmitter::EmitHostToGuestThunk() { - // rcx = target - // rdx = arg0 (context) - // r8 = arg1 (guest return address) + // 1st native reg = target + // 2nd native reg = arg0 (context) + // 3rd native reg = arg1 (guest return address) + _code_offsets code_offsets = {}; @@ -587,10 +588,10 @@ HostToGuestThunk X64HelperEmitter::EmitHostToGuestThunk() { code_offsets.prolog = getSize(); // rsp + 0 = return address - mov(qword[rsp + 8 * 3], r8); - mov(qword[rsp + 8 * 2], rdx); - mov(qword[rsp + 8 * 1], rcx); sub(rsp, stack_size); + mov(qword[rsp + offsetof(StackLayout::Thunk, arg_temp[2])], GetNativeReg(2)); + mov(qword[rsp + offsetof(StackLayout::Thunk, arg_temp[1])], GetNativeReg(1)); + mov(qword[rsp + offsetof(StackLayout::Thunk, arg_temp[0])], GetNativeReg(0)); code_offsets.prolog_stack_alloc = getSize(); code_offsets.body = getSize(); @@ -598,10 +599,10 @@ HostToGuestThunk X64HelperEmitter::EmitHostToGuestThunk() { // Save nonvolatile registers. EmitSaveNonvolatileRegs(); - mov(rax, rcx); - mov(rsi, rdx); // context + mov(rax, GetNativeReg(0)); + mov(rsi, GetNativeReg(1)); // context mov(rdi, ptr[rdx + offsetof(ppc::PPCContext, virtual_membase)]); // membase - mov(rcx, r8); // return address + mov(rcx, GetNativeReg(2)); // return address call(rax); vzeroupper(); EmitLoadNonvolatileRegs(); @@ -609,9 +610,9 @@ HostToGuestThunk X64HelperEmitter::EmitHostToGuestThunk() { code_offsets.epilog = getSize(); add(rsp, stack_size); - mov(rcx, qword[rsp + 8 * 1]); - mov(rdx, qword[rsp + 8 * 2]); - mov(r8, qword[rsp + 8 * 3]); + mov(GetNativeReg(0), qword[rsp + offsetof(StackLayout::Thunk, arg_temp[0])]); + mov(GetNativeReg(1), qword[rsp + offsetof(StackLayout::Thunk, arg_temp[1])]); + mov(GetNativeReg(2), qword[rsp + offsetof(StackLayout::Thunk, arg_temp[2])]); ret(); code_offsets.tail = getSize(); @@ -632,11 +633,10 @@ HostToGuestThunk X64HelperEmitter::EmitHostToGuestThunk() { } GuestToHostThunk X64HelperEmitter::EmitGuestToHostThunk() { - // rcx = target function - // rdx = arg0 - // r8 = arg1 - // r9 = arg2 - + // 1st native reg = target function + // 2nd native reg = arg0 + // 3rd native reg = arg1 + // 4th native reg = arg2 _code_offsets code_offsets = {}; const size_t stack_size = StackLayout::THUNK_STACK_SIZE; @@ -653,8 +653,8 @@ GuestToHostThunk X64HelperEmitter::EmitGuestToHostThunk() { // Save off volatile registers. EmitSaveVolatileRegs(); - mov(rax, rcx); // function - mov(rcx, GetContextReg()); // context + mov(rax, GetNativeReg(0)); // function + mov(GetNativeReg(0), GetContextReg()); // context call(rax); EmitLoadVolatileRegs(); @@ -703,8 +703,8 @@ ResolveFunctionThunk X64HelperEmitter::EmitResolveFunctionThunk() { // Save volatile registers EmitSaveVolatileRegs(); - mov(rcx, rsi); // context - mov(rdx, rbx); + mov(GetNativeReg(0), GetContextReg()); // context + mov(GetNativeReg(1), rbx); mov(rax, reinterpret_cast<uint64_t>(&ResolveFunction)); call(rax); diff --git a/src/xenia/cpu/backend/x64/x64_emitter.cc b/src/xenia/cpu/backend/x64/x64_emitter.cc index da9816a35d..7265eb8f4b 100644 --- a/src/xenia/cpu/backend/x64/x64_emitter.cc +++ b/src/xenia/cpu/backend/x64/x64_emitter.cc @@ -78,8 +78,10 @@ static const size_t kMaxCodeSize = 1_MiB; const uint32_t X64Emitter::gpr_reg_map_[X64Emitter::GPR_COUNT] = { Xbyak::Operand::RBX, Xbyak::Operand::R10, Xbyak::Operand::R11, - Xbyak::Operand::R12, Xbyak::Operand::R13, Xbyak::Operand::R14, - Xbyak::Operand::R15, + Xbyak::Operand::R12, Xbyak::Operand::R13, +#if XE_PLATFORM_WIN32 + Xbyak::Operand::R14, Xbyak::Operand::R15, +#endif }; const uint32_t X64Emitter::xmm_reg_map_[X64Emitter::XMM_COUNT] = { @@ -224,7 +226,7 @@ bool X64Emitter::Emit(HIRBuilder* builder, EmitFunctionInfo& func_info) { mov(qword[rsp + StackLayout::GUEST_CTX_HOME], GetContextReg()); */ - mov(qword[rsp + StackLayout::GUEST_RET_ADDR], rcx); + mov(qword[rsp + StackLayout::GUEST_RET_ADDR], GetNativeReg(0)); mov(qword[rsp + StackLayout::GUEST_CALL_RET_ADDR], rax); // 0 @@ -691,7 +693,7 @@ void X64Emitter::Call(const hir::Instr* instr, GuestFunction* function) { EmitTraceUserCallReturn(); EmitProfilerEpilogue(); // Pass the callers return address over. - mov(rcx, qword[rsp + StackLayout::GUEST_RET_ADDR]); + mov(GetNativeReg(0), qword[rsp + StackLayout::GUEST_RET_ADDR]); add(rsp, static_cast<uint32_t>(stack_size())); PopStackpoint(); @@ -718,7 +720,7 @@ void X64Emitter::Call(const hir::Instr* instr, GuestFunction* function) { EmitTraceUserCallReturn(); EmitProfilerEpilogue(); // Pass the callers return address over. - mov(rcx, qword[rsp + StackLayout::GUEST_RET_ADDR]); + mov(GetNativeReg(0), qword[rsp + StackLayout::GUEST_RET_ADDR]); add(rsp, static_cast<uint32_t>(stack_size())); PopStackpoint(); @@ -752,9 +754,13 @@ void X64Emitter::CallIndirect(const hir::Instr* instr, } else { // Old-style resolve. // Not too important because indirection table is almost always available. +#if XE_PLATFORM_WIN32 mov(edx, reg.cvt32()); +#else + mov(esi, reg.cvt32()); +#endif mov(rax, reinterpret_cast<uint64_t>(ResolveFunction)); - mov(rcx, GetContextReg()); + mov(GetNativeReg(0), GetContextReg()); call(rax); } @@ -764,14 +770,14 @@ void X64Emitter::CallIndirect(const hir::Instr* instr, EmitTraceUserCallReturn(); EmitProfilerEpilogue(); // Pass the callers return address over. - mov(rcx, qword[rsp + StackLayout::GUEST_RET_ADDR]); + mov(GetNativeReg(0), qword[rsp + StackLayout::GUEST_RET_ADDR]); add(rsp, static_cast<uint32_t>(stack_size())); PopStackpoint(); jmp(rax); } else { // Return address is from the previous SET_RETURN_ADDRESS. - mov(rcx, qword[rsp + StackLayout::GUEST_CALL_RET_ADDR]); + mov(GetNativeReg(0), qword[rsp + StackLayout::GUEST_CALL_RET_ADDR]); call(rax); synchronize_stack_on_next_instruction_ = true; @@ -857,16 +863,36 @@ void X64Emitter::SetReturnAddress(uint64_t value) { mov(qword[rsp + StackLayout::GUEST_CALL_RET_ADDR], rax); } -Xbyak::Reg64 X64Emitter::GetNativeParam(uint32_t param) { - if (param == 0) +Xbyak::Reg64 X64Emitter::GetNativeReg(uint32_t reg) { +#if XE_PLATFORM_WIN32 + if (reg == 0) + return rcx; + else if (reg == 1) return rdx; - else if (param == 1) + else if (reg == 2) return r8; - else if (param == 2) + else if (reg == 3) return r9; assert_always(); return r9; +#else + if (reg == 0) + return rdi; + else if (reg == 1) + return rsi; + else if (reg == 2) + return rdx; + else if (reg == 3) + return rcx; + + assert_always(); + return rcx; +#endif +} + +Xbyak::Reg64 X64Emitter::GetNativeParam(uint32_t param) { + return GetNativeReg(param + 1); } // Important: If you change these, you must update the thunks in x64_backend.cc! diff --git a/src/xenia/cpu/backend/x64/x64_emitter.h b/src/xenia/cpu/backend/x64/x64_emitter.h index 4fdeab4a4b..1ddd44b5db 100644 --- a/src/xenia/cpu/backend/x64/x64_emitter.h +++ b/src/xenia/cpu/backend/x64/x64_emitter.h @@ -217,6 +217,7 @@ class X64Emitter : public Xbyak::CodeGenerator { std::vector<SourceMapEntry>* out_source_map); public: +#if XE_PLATFORM_WIN32 // Reserved: rsp, rsi, rdi // Scratch: rax/rcx/rdx // xmm0-2 @@ -224,6 +225,15 @@ class X64Emitter : public Xbyak::CodeGenerator { // xmm4-xmm15 (save to get xmm3) static const int GPR_COUNT = 7; static const int XMM_COUNT = 12; +#else + // Reserved: rsp, r14, r15 + // Scratch: rax/rdi/rsi/rcx/rdx + // xmm0-2 + // Available: rbx, r10-r13 + // xmm4-xmm15 (save to get xmm3) + static const int GPR_COUNT = 5; + static const int XMM_COUNT = 12; +#endif static constexpr size_t kStashOffset = 32; static void SetupReg(const hir::Value* v, Xbyak::Reg8& r) { auto idx = gpr_reg_map_[v->reg.index]; @@ -263,8 +273,10 @@ class X64Emitter : public Xbyak::CodeGenerator { void CallNative(uint64_t (*fn)(void* raw_context, uint64_t arg0), uint64_t arg0); void CallNativeSafe(void* fn); + void SetReturnAddress(uint64_t value); + Xbyak::Reg64 GetNativeReg(uint32_t reg); Xbyak::Reg64 GetNativeParam(uint32_t param); Xbyak::Reg64 GetContextReg() const; diff --git a/src/xenia/cpu/backend/x64/x64_tracers.cc b/src/xenia/cpu/backend/x64/x64_tracers.cc index afe27ec21e..727808225e 100644 --- a/src/xenia/cpu/backend/x64/x64_tracers.cc +++ b/src/xenia/cpu/backend/x64/x64_tracers.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2014 Ben Vanik. All rights reserved. * + * Copyright 2022 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/backend/x64/x64_tracers.h b/src/xenia/cpu/backend/x64/x64_tracers.h index 20a6710984..4a6d0c18f6 100644 --- a/src/xenia/cpu/backend/x64/x64_tracers.h +++ b/src/xenia/cpu/backend/x64/x64_tracers.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2014 Ben Vanik. All rights reserved. * + * Copyright 2022 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/hir/value.cc b/src/xenia/cpu/hir/value.cc index 84b28a8f23..c05d442ac8 100644 --- a/src/xenia/cpu/hir/value.cc +++ b/src/xenia/cpu/hir/value.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2021 Ben Vanik. All rights reserved. * + * Copyright 2022 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/hir/value.h b/src/xenia/cpu/hir/value.h index 3a1cd442e2..15eaf7827f 100644 --- a/src/xenia/cpu/hir/value.h +++ b/src/xenia/cpu/hir/value.h @@ -10,6 +10,7 @@ #ifndef XENIA_CPU_HIR_VALUE_H_ #define XENIA_CPU_HIR_VALUE_H_ +#include <climits> #include "xenia/base/arena.h" #include "xenia/base/assert.h" #include "xenia/base/vec128.h" diff --git a/src/xenia/cpu/ppc/ppc_context.h b/src/xenia/cpu/ppc/ppc_context.h index 629b28392a..5122b5673d 100644 --- a/src/xenia/cpu/ppc/ppc_context.h +++ b/src/xenia/cpu/ppc/ppc_context.h @@ -438,8 +438,8 @@ typedef struct alignas(64) PPCContext_s { } return reinterpret_cast<T>(host_address); #else - return processor->memory()->TranslateVirtual<T>(guest_address); - + uint8_t* host_address = virtual_membase + guest_address; + return reinterpret_cast<T>(host_address); #endif } //for convenience in kernel functions, version that auto narrows to uint32 diff --git a/src/xenia/cpu/ppc/ppc_frontend.cc b/src/xenia/cpu/ppc/ppc_frontend.cc index b2c1094ced..d7d839573c 100644 --- a/src/xenia/cpu/ppc/ppc_frontend.cc +++ b/src/xenia/cpu/ppc/ppc_frontend.cc @@ -57,15 +57,15 @@ Memory* PPCFrontend::memory() const { return processor_->memory(); } // Checks the state of the global lock and sets scratch to the current MSR // value. void CheckGlobalLock(PPCContext* ppc_context, void* arg0, void* arg1) { - auto global_mutex = reinterpret_cast<xe_global_mutex*>(arg0); + auto global_mutex = reinterpret_cast<global_mutex_type *>(arg0); auto global_lock_count = reinterpret_cast<int32_t*>(arg1); - std::lock_guard<xe_global_mutex> lock(*global_mutex); + std::lock_guard<global_mutex_type> lock(*global_mutex); ppc_context->scratch = *global_lock_count ? 0 : 0x8000; } // Enters the global lock. Safe to recursion. void EnterGlobalLock(PPCContext* ppc_context, void* arg0, void* arg1) { - auto global_mutex = reinterpret_cast<xe_global_mutex*>(arg0); + auto global_mutex = reinterpret_cast<global_mutex_type *>(arg0); auto global_lock_count = reinterpret_cast<int32_t*>(arg1); global_mutex->lock(); xe::atomic_inc(global_lock_count); @@ -73,7 +73,7 @@ void EnterGlobalLock(PPCContext* ppc_context, void* arg0, void* arg1) { // Leaves the global lock. Safe to recursion. void LeaveGlobalLock(PPCContext* ppc_context, void* arg0, void* arg1) { - auto global_mutex = reinterpret_cast<xe_global_mutex*>(arg0); + auto global_mutex = reinterpret_cast<global_mutex_type *>(arg0); auto global_lock_count = reinterpret_cast<int32_t*>(arg1); auto new_lock_count = xe::atomic_dec(global_lock_count); assert_true(new_lock_count >= 0); diff --git a/src/xenia/cpu/ppc/ppc_translator.cc b/src/xenia/cpu/ppc/ppc_translator.cc index 69b0da4e3a..d01213a07b 100644 --- a/src/xenia/cpu/ppc/ppc_translator.cc +++ b/src/xenia/cpu/ppc/ppc_translator.cc @@ -139,7 +139,11 @@ void PPCTranslator::DumpHIR(GuestFunction* function, PPCHIRBuilder* builder) { { wchar_t tmpbuf[64]; +#ifdef XE_PLATFORM_WINDOWS _snwprintf(tmpbuf, 64, L"%X", function->address()); +#else + swprintf(tmpbuf, 64, L"%X", function->address()); +#endif folder_path.append(&tmpbuf[0]); } diff --git a/src/xenia/cpu/testing/util.h b/src/xenia/cpu/testing/util.h index 8f6df2d577..34e80157bc 100644 --- a/src/xenia/cpu/testing/util.h +++ b/src/xenia/cpu/testing/util.h @@ -74,7 +74,6 @@ class TestFunction { uint32_t stack_address = memory_size - stack_size; uint32_t thread_state_address = stack_address - 0x1000; auto thread_state = std::make_unique<ThreadState>(processor.get(), 0x100); - assert_always(); // TODO: Allocate a thread stack!!! auto ctx = thread_state->context(); ctx->lr = 0xBCBCBCBC; diff --git a/src/xenia/cpu/xex_module.cc b/src/xenia/cpu/xex_module.cc index de9ddf26da..cdba1c97c4 100644 --- a/src/xenia/cpu/xex_module.cc +++ b/src/xenia/cpu/xex_module.cc @@ -1114,7 +1114,11 @@ void XexModule::Precompile() { char fmtbuf[16]; for (unsigned i = 0; i < 16; ++i) { +#ifdef XE_PLATFORM_WINDOWS sprintf_s(fmtbuf, "%X", image_sha_bytes_[i]); +#else + sprintf(fmtbuf, "%X", image_sha_bytes_[i]); +#endif image_sha_str_ += &fmtbuf[0]; } diff --git a/src/xenia/gpu/command_processor.h b/src/xenia/gpu/command_processor.h index 46ce73d9e1..d7a4220975 100644 --- a/src/xenia/gpu/command_processor.h +++ b/src/xenia/gpu/command_processor.h @@ -164,8 +164,10 @@ class CommandProcessor { XE_FORCEINLINE virtual void WriteRegistersFromMem(uint32_t start_index, uint32_t* base, uint32_t num_registers); - + //FIXME(RodoMa92): This errors out if forced inline on linux +#ifdef XE_PLATFORM_WINDOWS XE_FORCEINLINE +#endif virtual void WriteRegisterRangeFromRing(xe::RingBuffer* ring, uint32_t base, uint32_t num_registers); diff --git a/src/xenia/gpu/draw_util.cc b/src/xenia/gpu/draw_util.cc index e6461e8bd3..43413efb1d 100644 --- a/src/xenia/gpu/draw_util.cc +++ b/src/xenia/gpu/draw_util.cc @@ -765,6 +765,13 @@ uint32_t GetNormalizedColorMask(const RegisterFile& regs, } return normalized_color_mask; } +XE_FORCEINLINE +bool IsPrimitivePolygonal(const RegisterFile& regs) { + return IsPrimitivePolygonal( + regs.Get<reg::VGT_OUTPUT_PATH_CNTL>().path_select == + xenos::VGTOutputPath::kTessellationEnable, + regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type); +} XE_NOINLINE XE_NOALIAS xenos::CopySampleSelect SanitizeCopySampleSelect( diff --git a/src/xenia/gpu/draw_util.h b/src/xenia/gpu/draw_util.h index 8196830b80..bff56c6b2c 100644 --- a/src/xenia/gpu/draw_util.h +++ b/src/xenia/gpu/draw_util.h @@ -98,13 +98,7 @@ constexpr bool IsPrimitivePolygonal(bool vgt_output_path_is_tessellation_enable, return (primitive_polygonal_table & (1U << static_cast<uint32_t>(type))) != 0; } -XE_FORCEINLINE -bool IsPrimitivePolygonal(const RegisterFile& regs) { - return IsPrimitivePolygonal( - regs.Get<reg::VGT_OUTPUT_PATH_CNTL>().path_select == - xenos::VGTOutputPath::kTessellationEnable, - regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type); -} +bool IsPrimitivePolygonal(const RegisterFile& regs); // Whether with the current state, any samples to rasterize (for any reason, not // only to write something to a render target, but also to do sample counting or diff --git a/src/xenia/gpu/pm4_command_processor_declare.h b/src/xenia/gpu/pm4_command_processor_declare.h index 5f3e45a764..00cc3752cc 100644 --- a/src/xenia/gpu/pm4_command_processor_declare.h +++ b/src/xenia/gpu/pm4_command_processor_declare.h @@ -6,9 +6,9 @@ #define PM4_OVERRIDE #endif void ExecuteIndirectBuffer(uint32_t ptr, - uint32_t count) XE_RESTRICT; + uint32_t count); virtual uint32_t ExecutePrimaryBuffer(uint32_t start_index, uint32_t end_index) - XE_RESTRICT PM4_OVERRIDE; + PM4_OVERRIDE; virtual bool ExecutePacket() PM4_OVERRIDE; public: @@ -16,100 +16,100 @@ void ExecutePacket(uint32_t ptr, uint32_t count); protected: XE_NOINLINE -void DisassembleCurrentPacket() XE_RESTRICT; +void DisassembleCurrentPacket(); XE_NOINLINE -bool ExecutePacketType0( uint32_t packet) XE_RESTRICT; +bool ExecutePacketType0( uint32_t packet); XE_NOINLINE -bool ExecutePacketType1( uint32_t packet) XE_RESTRICT; +bool ExecutePacketType1( uint32_t packet); -bool ExecutePacketType2( uint32_t packet) XE_RESTRICT; +bool ExecutePacketType2( uint32_t packet); XE_NOINLINE -bool ExecutePacketType3( uint32_t packet) XE_RESTRICT; +bool ExecutePacketType3( uint32_t packet); XE_NOINLINE bool ExecutePacketType3_ME_INIT( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_NOP( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_INTERRUPT( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_XE_SWAP( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_INDIRECT_BUFFER( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_WAIT_REG_MEM( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_REG_RMW( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_REG_TO_MEM( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_MEM_WRITE( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_COND_WRITE( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_EVENT_WRITE( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_EVENT_WRITE_SHD( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_EVENT_WRITE_EXT( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_EVENT_WRITE_ZPD( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3Draw( uint32_t packet, const char* opcode_name, uint32_t viz_query_condition, - uint32_t count_remaining) XE_RESTRICT; + uint32_t count_remaining); bool ExecutePacketType3_DRAW_INDX( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_DRAW_INDX_2( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_FORCEINLINE bool ExecutePacketType3_SET_CONSTANT( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_NOINLINE bool ExecutePacketType3_SET_CONSTANT2( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_FORCEINLINE bool ExecutePacketType3_LOAD_ALU_CONSTANT( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_SET_SHADER_CONSTANTS( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_IM_LOAD( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_IM_LOAD_IMMEDIATE( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_INVALIDATE_STATE( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); bool ExecutePacketType3_VIZ_QUERY( uint32_t packet, - uint32_t count) XE_RESTRICT; + uint32_t count); XE_FORCEINLINE -void WriteEventInitiator(uint32_t value) XE_RESTRICT; +void WriteEventInitiator(uint32_t value); XE_NOINLINE XE_COLD -bool HitUnimplementedOpcode(uint32_t opcode, uint32_t count) XE_RESTRICT; +bool HitUnimplementedOpcode(uint32_t opcode, uint32_t count); XE_FORCEINLINE XE_NOALIAS diff --git a/src/xenia/gpu/pm4_command_processor_implement.h b/src/xenia/gpu/pm4_command_processor_implement.h index 62e2b1f647..565cf9b31f 100644 --- a/src/xenia/gpu/pm4_command_processor_implement.h +++ b/src/xenia/gpu/pm4_command_processor_implement.h @@ -6,7 +6,7 @@ using namespace xe::gpu::xenos; void COMMAND_PROCESSOR::ExecuteIndirectBuffer(uint32_t ptr, - uint32_t count) XE_RESTRICT { + uint32_t count) { SCOPE_profile_cpu_f("gpu"); trace_writer_.WriteIndirectBufferStart(ptr, count * sizeof(uint32_t)); @@ -79,7 +79,7 @@ std::string GenerateRegnameForPm4Print(uint32_t reg) { } XE_NOINLINE -void COMMAND_PROCESSOR::DisassembleCurrentPacket() XE_RESTRICT { +void COMMAND_PROCESSOR::DisassembleCurrentPacket() { xe::gpu::PacketInfo packet_info; logging::LoggerBatch<LogLevel::Debug> logger{}; @@ -325,7 +325,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType0_CountOverflow(uint32_t count) { the most frequently called functions for PM4 */ XE_NOINLINE -bool COMMAND_PROCESSOR::ExecutePacketType0(uint32_t packet) XE_RESTRICT { +bool COMMAND_PROCESSOR::ExecutePacketType0(uint32_t packet) { // Type-0 packet. // Write count registers in sequence to the registers starting at // (base_index << 2). @@ -354,7 +354,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType0(uint32_t packet) XE_RESTRICT { } } XE_NOINLINE -bool COMMAND_PROCESSOR::ExecutePacketType1(uint32_t packet) XE_RESTRICT { +bool COMMAND_PROCESSOR::ExecutePacketType1(uint32_t packet) { // Type-1 packet. // Contains two registers of data. Type-0 should be more common. trace_writer_.WritePacketStart(uint32_t(reader_.read_ptr() - 4), 3); @@ -368,7 +368,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType1(uint32_t packet) XE_RESTRICT { return true; } -bool COMMAND_PROCESSOR::ExecutePacketType2(uint32_t packet) XE_RESTRICT { +bool COMMAND_PROCESSOR::ExecutePacketType2(uint32_t packet) { // Type-2 packet. // No-op. Do nothing. trace_writer_.WritePacketStart(uint32_t(reader_.read_ptr() - 4), 1); @@ -389,7 +389,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_CountOverflow(uint32_t count) { return false; } XE_NOINLINE -bool COMMAND_PROCESSOR::ExecutePacketType3(uint32_t packet) XE_RESTRICT { +bool COMMAND_PROCESSOR::ExecutePacketType3(uint32_t packet) { // Type-3 packet. uint32_t opcode = (packet >> 8) & 0x7F; uint32_t count = ((packet >> 16) & 0x3FFF) + 1; @@ -601,7 +601,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3(uint32_t packet) XE_RESTRICT { XE_NOINLINE XE_COLD bool COMMAND_PROCESSOR::HitUnimplementedOpcode(uint32_t opcode, - uint32_t count) XE_RESTRICT { + uint32_t count) { XELOGGPU("Unimplemented GPU OPCODE: 0x{:02X}\t\tCOUNT: {}\n", opcode, count); assert_always(); reader_.AdvanceRead(count * sizeof(uint32_t)); @@ -610,7 +610,7 @@ bool COMMAND_PROCESSOR::HitUnimplementedOpcode(uint32_t opcode, } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_ME_INIT(uint32_t packet, - uint32_t count) XE_RESTRICT { + uint32_t count) { // initialize CP's micro-engine me_bin_.resize(count); for (uint32_t i = 0; i < count; i++) { @@ -620,7 +620,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_ME_INIT(uint32_t packet, } bool COMMAND_PROCESSOR::ExecutePacketType3_NOP(uint32_t packet, - uint32_t count) XE_RESTRICT { + uint32_t count) { // skip N 32-bit words to get to the next packet // No-op, ignore some data. reader_.AdvanceRead(count * sizeof(uint32_t)); @@ -628,7 +628,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_NOP(uint32_t packet, } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_INTERRUPT( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { SCOPE_profile_cpu_f("gpu"); // generate interrupt from the command stream @@ -642,7 +642,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_INTERRUPT( } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_XE_SWAP(uint32_t packet, - uint32_t count) XE_RESTRICT { + uint32_t count) { SCOPE_profile_cpu_f("gpu"); Profiler::Flip(); @@ -668,7 +668,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_XE_SWAP(uint32_t packet, } bool COMMAND_PROCESSOR::ExecutePacketType3_INDIRECT_BUFFER( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // indirect buffer dispatch uint32_t list_ptr = CpuToGpu(reader_.ReadAndSwap<uint32_t>()); uint32_t list_length = reader_.ReadAndSwap<uint32_t>(); @@ -721,7 +721,7 @@ static bool MatchValueAndRef(uint32_t value, uint32_t ref, uint32_t wait_info) { } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_WAIT_REG_MEM( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { SCOPE_profile_cpu_f("gpu"); // wait until a register or memory location is a specific value @@ -776,7 +776,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_WAIT_REG_MEM( } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_REG_RMW(uint32_t packet, - uint32_t count) XE_RESTRICT { + uint32_t count) { // register read/modify/write // ? (used during shader upload and edram setup) uint32_t rmw_info = reader_.ReadAndSwap<uint32_t>(); @@ -802,7 +802,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_REG_RMW(uint32_t packet, } bool COMMAND_PROCESSOR::ExecutePacketType3_REG_TO_MEM( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // Copy Register to Memory (?) // Count is 2, assuming a Register Addr and a Memory Addr. @@ -824,7 +824,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_REG_TO_MEM( } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_MEM_WRITE( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { uint32_t write_addr = reader_.ReadAndSwap<uint32_t>(); for (uint32_t i = 0; i < count - 1; i++) { uint32_t write_data = reader_.ReadAndSwap<uint32_t>(); @@ -841,7 +841,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_MEM_WRITE( } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_COND_WRITE( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // conditional write to memory or register uint32_t wait_info = reader_.ReadAndSwap<uint32_t>(); uint32_t poll_reg_addr = reader_.ReadAndSwap<uint32_t>(); @@ -881,11 +881,11 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_COND_WRITE( return true; } XE_FORCEINLINE -void COMMAND_PROCESSOR::WriteEventInitiator(uint32_t value) XE_RESTRICT { +void COMMAND_PROCESSOR::WriteEventInitiator(uint32_t value) { register_file_->values[XE_GPU_REG_VGT_EVENT_INITIATOR].u32 = value; } bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // generate an event that creates a write to memory when completed uint32_t initiator = reader_.ReadAndSwap<uint32_t>(); // Writeback initiator. @@ -902,7 +902,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE( } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_SHD( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // generate a VS|PS_done event uint32_t initiator = reader_.ReadAndSwap<uint32_t>(); uint32_t address = reader_.ReadAndSwap<uint32_t>(); @@ -926,7 +926,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_SHD( } bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_EXT( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // generate a screen extent event uint32_t initiator = reader_.ReadAndSwap<uint32_t>(); uint32_t address = reader_.ReadAndSwap<uint32_t>(); @@ -962,7 +962,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_EXT( } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_ZPD( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // Set by D3D as BE but struct ABI is LE const uint32_t kQueryFinished = xe::byte_swap(0xFFFFFEED); assert_true(count == 1); @@ -997,7 +997,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_ZPD( bool COMMAND_PROCESSOR::ExecutePacketType3Draw( uint32_t packet, const char* opcode_name, uint32_t viz_query_condition, - uint32_t count_remaining) XE_RESTRICT { + uint32_t count_remaining) { // if viz_query_condition != 0, this is a conditional draw based on viz query. // This ID matches the one issued in PM4_VIZ_QUERY // uint32_t viz_id = viz_query_condition & 0x3F; @@ -1112,7 +1112,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3Draw( } bool COMMAND_PROCESSOR::ExecutePacketType3_DRAW_INDX( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // "initiate fetch of index buffer and draw" // Generally used by Xbox 360 Direct3D 9 for kDMA and kAutoIndex sources. // With a viz query token as the first one. @@ -1129,7 +1129,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_DRAW_INDX( } bool COMMAND_PROCESSOR::ExecutePacketType3_DRAW_INDX_2( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // "draw using supplied indices in packet" // Generally used by Xbox 360 Direct3D 9 for kAutoIndex source. // No viz query token. @@ -1138,7 +1138,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_DRAW_INDX_2( } XE_FORCEINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_SET_CONSTANT( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // load constant into chip and to memory // PM4_REG(reg) ((0x4 << 16) | (GSL_HAL_SUBBLOCK_OFFSET(reg))) // reg - 0x2000 @@ -1181,7 +1181,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_SET_CONSTANT( } XE_NOINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_SET_CONSTANT2( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { uint32_t offset_type = reader_.ReadAndSwap<uint32_t>(); uint32_t index = offset_type & 0xFFFF; uint32_t countm1 = count - 1; @@ -1192,7 +1192,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_SET_CONSTANT2( } XE_FORCEINLINE bool COMMAND_PROCESSOR::ExecutePacketType3_LOAD_ALU_CONSTANT( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // load constants from memory uint32_t address = reader_.ReadAndSwap<uint32_t>(); address &= 0x3FFFFFFF; @@ -1245,7 +1245,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_LOAD_ALU_CONSTANT( } bool COMMAND_PROCESSOR::ExecutePacketType3_SET_SHADER_CONSTANTS( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { uint32_t offset_type = reader_.ReadAndSwap<uint32_t>(); uint32_t index = offset_type & 0xFFFF; uint32_t countm1 = count - 1; @@ -1255,7 +1255,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_SET_SHADER_CONSTANTS( } bool COMMAND_PROCESSOR::ExecutePacketType3_IM_LOAD(uint32_t packet, - uint32_t count) XE_RESTRICT { + uint32_t count) { SCOPE_profile_cpu_f("gpu"); // load sequencer instruction memory (pointer-based) @@ -1285,7 +1285,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_IM_LOAD(uint32_t packet, } bool COMMAND_PROCESSOR::ExecutePacketType3_IM_LOAD_IMMEDIATE( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { SCOPE_profile_cpu_f("gpu"); // load sequencer instruction memory (code embedded in packet) @@ -1321,7 +1321,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_IM_LOAD_IMMEDIATE( */ bool COMMAND_PROCESSOR::ExecutePacketType3_INVALIDATE_STATE( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // selective invalidation of state pointers /*uint32_t mask =*/reader_.ReadAndSwap<uint32_t>(); // driver_->InvalidateState(mask); @@ -1329,7 +1329,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_INVALIDATE_STATE( } bool COMMAND_PROCESSOR::ExecutePacketType3_VIZ_QUERY( - uint32_t packet, uint32_t count) XE_RESTRICT { + uint32_t packet, uint32_t count) { // begin/end initiator for viz query extent processing // https://www.google.com/patents/US20050195186 assert_true(count == 1); diff --git a/src/xenia/gpu/register_file.cc b/src/xenia/gpu/register_file.cc index 5dd580e077..ecc21c6dbd 100644 --- a/src/xenia/gpu/register_file.cc +++ b/src/xenia/gpu/register_file.cc @@ -9,6 +9,7 @@ #include "xenia/gpu/register_file.h" #include <array> +#include <climits> #include <cstring> #include "xenia/base/math.h" diff --git a/src/xenia/gpu/shared_memory.cc b/src/xenia/gpu/shared_memory.cc index a94aa053bc..416a27bd95 100644 --- a/src/xenia/gpu/shared_memory.cc +++ b/src/xenia/gpu/shared_memory.cc @@ -482,7 +482,8 @@ void SharedMemory::TryFindUploadRange(const uint32_t& block_first, } static bool UploadRange_DoBestScanForward(uint64_t v, uint32_t* out) { -#if XE_ARCH_AMD64 == 1 +//_BitScanForward64 is a Microsoft specific function +#if XE_ARCH_AMD64 == 1 && XE_PLATFORM_WINDOWS if (!v) { return false; } diff --git a/src/xenia/kernel/achievement_manager.cc b/src/xenia/kernel/achievement_manager.cc index e58965b84b..6217a2795d 100644 --- a/src/xenia/kernel/achievement_manager.cc +++ b/src/xenia/kernel/achievement_manager.cc @@ -53,12 +53,14 @@ void AchievementManager::EarnAchievement(uint64_t xuid, uint32_t title_id, if (!cvars::show_achievement_notification) { continue; } - + //FIXME(RodoMa92): This call fails to compile under linux, disabled for now +#ifdef XE_PLATFORM_WINDOWS app_context.CallInUIThread([imgui_drawer, description]() { - new xe::ui::AchievementNotificationWindow( + new ui::AchievementNotificationWindow( imgui_drawer, "Achievement unlocked", description, 0, kernel_state()->notification_position_); }); +#endif } } } diff --git a/src/xenia/kernel/premake5.lua b/src/xenia/kernel/premake5.lua index 1061c24ea5..5da51373a5 100644 --- a/src/xenia/kernel/premake5.lua +++ b/src/xenia/kernel/premake5.lua @@ -17,6 +17,9 @@ project("xenia-kernel") }) defines({ }) + includedirs({ + project_root.."/xenia/base/", + }) recursive_platform_files() files({ "debug_visualizers.natvis", diff --git a/src/xenia/kernel/util/object_table.cc b/src/xenia/kernel/util/object_table.cc index 4568c72d15..cf707ea10d 100644 --- a/src/xenia/kernel/util/object_table.cc +++ b/src/xenia/kernel/util/object_table.cc @@ -13,6 +13,7 @@ #include <cstring> #include "xenia/base/byte_stream.h" +#include "xenia/base/demangle.h" #include "xenia/base/logging.h" #include "xenia/kernel/xobject.h" #include "xenia/kernel/xthread.h" @@ -144,7 +145,8 @@ X_STATUS ObjectTable::AddHandle(XObject* object, X_HANDLE* out_handle) { // Retain so long as the object is in the table. object->Retain(); - XELOGI("Added handle:{:08X} for {}", handle, typeid(*object).name()); + XELOGI("Added handle:{:08X} for {}", handle, + Demangle(typeid(*object).name())); } } @@ -231,7 +233,8 @@ X_STATUS ObjectTable::RemoveHandle(X_HANDLE handle) { object->handles().erase(handle_entry); } - XELOGI("Removed handle:{:08X} for {}", handle, typeid(*object).name()); + XELOGI("Removed handle:{:08X} for {}", handle, + Demangle(typeid(*object).name()).c_str()); // Remove object name from mapping to prevent naming collision. if (!object->name().empty()) { diff --git a/src/xenia/kernel/xam/xam_info.cc b/src/xenia/kernel/xam/xam_info.cc index 6ffaccc2e6..580c599686 100644 --- a/src/xenia/kernel/xam/xam_info.cc +++ b/src/xenia/kernel/xam/xam_info.cc @@ -23,6 +23,8 @@ #if XE_PLATFORM_WIN32 #include "xenia/base/platform_win.h" +#elif XE_PLATFORM_LINUX +#include "xenia/base/platform_linux.h" #endif #include "third_party/fmt/include/fmt/format.h" diff --git a/src/xenia/kernel/xobject.cc b/src/xenia/kernel/xobject.cc index cee06c07a2..7a0fd0ec52 100644 --- a/src/xenia/kernel/xobject.cc +++ b/src/xenia/kernel/xobject.cc @@ -447,12 +447,12 @@ object_ref<XObject> XObject::GetNativeObject(KernelState* kernel_state, StashHandle(header, object->handle()); result = object; - return_result: - if (!already_locked) { - global_critical_region::mutex().unlock(); - } - return object_ref<XObject>(result); } +return_result: + if (!already_locked) { + global_critical_region::mutex().unlock(); + } + return object_ref<XObject>(result); } } // namespace kernel diff --git a/src/xenia/kernel/xsocket.cc b/src/xenia/kernel/xsocket.cc index 3e8f754b86..6667ab8100 100644 --- a/src/xenia/kernel/xsocket.cc +++ b/src/xenia/kernel/xsocket.cc @@ -75,8 +75,13 @@ X_STATUS XSocket::Close() { X_STATUS XSocket::GetOption(uint32_t level, uint32_t optname, void* optval_ptr, int* optlen) { +#ifdef XE_PLATFORM_WINDOWS int ret = getsockopt(native_handle_, level, optname, (char*)optval_ptr, optlen); +#else + int ret = + getsockopt(native_handle_, level, optname, (char*)optval_ptr, (unsigned int *)optlen); +#endif if (ret < 0) { // TODO: WSAGetLastError() return X_STATUS_UNSUCCESSFUL; diff --git a/src/xenia/memory.cc b/src/xenia/memory.cc index 6384f49960..b67a38ad64 100644 --- a/src/xenia/memory.cc +++ b/src/xenia/memory.cc @@ -1714,7 +1714,7 @@ void PhysicalHeap::EnableAccessCallbacks(uint32_t physical_address, template <bool enable_invalidation_notifications> XE_NOINLINE void PhysicalHeap::EnableAccessCallbacksInner( const uint32_t system_page_first, const uint32_t system_page_last, - xe::memory::PageAccess protect_access) XE_RESTRICT { + xe::memory::PageAccess protect_access) { uint8_t* protect_base = membase_ + heap_base_; uint32_t protect_system_page_first = UINT32_MAX; diff --git a/src/xenia/memory.h b/src/xenia/memory.h index 77b8ff44f1..992f859a3f 100644 --- a/src/xenia/memory.h +++ b/src/xenia/memory.h @@ -274,7 +274,7 @@ class PhysicalHeap : public BaseHeap { template <bool enable_invalidation_notifications> XE_NOINLINE void EnableAccessCallbacksInner( const uint32_t system_page_first, const uint32_t system_page_last, - xe::memory::PageAccess protect_access) XE_RESTRICT; + xe::memory::PageAccess protect_access); // Returns true if any page in the range was watched. bool TriggerCallbacks(global_unique_lock_type global_lock_locked_once, diff --git a/src/xenia/ui/imgui_notification.cc b/src/xenia/ui/imgui_notification.cc index d22ac032a1..aa2ded56be 100644 --- a/src/xenia/ui/imgui_notification.cc +++ b/src/xenia/ui/imgui_notification.cc @@ -13,6 +13,7 @@ #include "xenia/base/logging.h" #include "xenia/base/platform.h" #include "xenia/ui/imgui_notification.h" +#include "xenia/cpu/ppc/ppc_context.h" #if XE_PLATFORM_WIN32 #include <playsoundapi.h> @@ -89,6 +90,9 @@ const ImVec2 CalculateNotificationScreenPosition( } const ImVec2 CalculateNotificationSize(ImVec2 text_size, float scale) { + //FIXME(RodoMa92): Workaround a GCC bug where floorf is not defined in the + //std namespace (ref:https://stackoverflow.com/questions/54623100/c-gcc-floorf-not-a-member-of-std) +#ifdef XE_PLATFORM_WINDOWS const ImVec2 result = ImVec2(std::floorf((default_notification_icon_size.x + default_notification_margin_size.x) * @@ -97,6 +101,16 @@ const ImVec2 CalculateNotificationSize(ImVec2 text_size, float scale) { std::floorf((default_notification_icon_size.y + default_notification_margin_size.y) * scale)); +#else + const ImVec2 result = + ImVec2(floorf((default_notification_icon_size.x + + default_notification_margin_size.x) * + scale) + + text_size.x, + floorf((default_notification_icon_size.y + + default_notification_margin_size.y) * + scale)); +#endif return result; } @@ -200,13 +214,23 @@ void AchievementNotificationWindow::OnDraw(ImGuiIO& io) { const ImVec2 notification_position = CalculateNotificationScreenPosition( screen_size, final_notification_size, GetPositionId()); +#ifdef XE_PLATFORM_WINDOWS if (isnan(notification_position.x) || isnan(notification_position.y)) { return; } +#else + if (std::isnan(notification_position.x) || std::isnan(notification_position.y)) { + return; + } +#endif ImVec2 current_notification_size = final_notification_size; current_notification_size.x *= notification_draw_progress_; +#ifdef XE_PLATFORM_WINDOWS current_notification_size.x = std::floorf(current_notification_size.x); +#else + current_notification_size.x = floorf(current_notification_size.x); +#endif // Initialize position and window size ImGui::SetNextWindowSize(current_notification_size); diff --git a/xenia-build b/xenia-build index 0bdbd2004a..5e5e55c1b6 100755 --- a/xenia-build +++ b/xenia-build @@ -1271,7 +1271,10 @@ class GenTestsCommand(Command): print('Generating test binaries...') print('') - binutils_path = os.path.join('third_party', 'binutils-ppc-cygwin') + if sys.platform == 'win32': + binutils_path = os.path.join('third_party', 'binutils-ppc-cygwin') + else: + binutils_path = os.path.join('third_party', 'binutils', 'bin') ppc_as = os.path.join(binutils_path, 'powerpc-none-elf-as') ppc_ld = os.path.join(binutils_path, 'powerpc-none-elf-ld') ppc_objdump = os.path.join(binutils_path, 'powerpc-none-elf-objdump') From ec4576eba6c1f01787588779e2d1c7414491185a Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Wed, 17 May 2023 17:18:48 +0200 Subject: [PATCH 02/16] Reverted small test change --- src/xenia/base/platform_amd64.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/xenia/base/platform_amd64.cc b/src/xenia/base/platform_amd64.cc index 7bced939e7..48b1c6102e 100644 --- a/src/xenia/base/platform_amd64.cc +++ b/src/xenia/base/platform_amd64.cc @@ -36,7 +36,6 @@ namespace amd64 { static uint64_t g_feature_flags = 0U; static bool g_did_initialize_feature_flags = false; uint64_t GetFeatureFlags() { - InitFeatureFlags(); xenia_assert(g_did_initialize_feature_flags); return g_feature_flags; } From f888b6276d1e03581a5fbac91c913c04ee845cfe Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Wed, 17 May 2023 18:53:53 +0200 Subject: [PATCH 03/16] Implemented QueryHostInterruptTime under linux --- src/xenia/base/clock_posix.cc | 3 +-- src/xenia/base/platform_linux.h | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/xenia/base/clock_posix.cc b/src/xenia/base/clock_posix.cc index c0ebc2ada9..0ec830e90d 100644 --- a/src/xenia/base/clock_posix.cc +++ b/src/xenia/base/clock_posix.cc @@ -55,7 +55,6 @@ uint64_t Clock::QueryHostUptimeMillis() { } uint64_t Clock::QueryHostInterruptTime() { - return *reinterpret_cast<uint64_t*>(KUserShared() + - KUSER_SHARED_INTERRUPTTIME_OFFSET); + return host_tick_count_platform(); } } // namespace xe diff --git a/src/xenia/base/platform_linux.h b/src/xenia/base/platform_linux.h index b23719f7f9..643d38bbb7 100644 --- a/src/xenia/base/platform_linux.h +++ b/src/xenia/base/platform_linux.h @@ -37,7 +37,4 @@ typedef union _LARGE_INTEGER { LONGLONG QuadPart; } LARGE_INTEGER, *PLARGE_INTEGER; -static constexpr size_t KUSER_SHARED_INTERRUPTTIME_OFFSET = 8; -static unsigned char* KUserShared() { return (unsigned char*)0x7FFE0000ULL; } - #endif // XENIA_BASE_PLATFORM_LINUX_H_ From e4396f2bd4d9c343900a5c2cf4c99fcf2050b6d5 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Wed, 28 Jun 2023 15:24:00 +0200 Subject: [PATCH 04/16] Implement LaunchFileExplorer for GNU Linux --- src/xenia/base/system_gnulinux.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/xenia/base/system_gnulinux.cc b/src/xenia/base/system_gnulinux.cc index 403e9b01ff..91ba0a580f 100644 --- a/src/xenia/base/system_gnulinux.cc +++ b/src/xenia/base/system_gnulinux.cc @@ -29,7 +29,11 @@ void LaunchWebBrowser(const std::string_view url) { system(cmd.c_str()); } -void LaunchFileExplorer(const std::filesystem::path& path) { assert_always(); } +void LaunchFileExplorer(const std::filesystem::path& path) { + auto cmd = std::string("xdg-open "); + cmd.append(path); + system(cmd.c_str()); +} void ShowSimpleMessageBox(SimpleMessageBoxType type, std::string_view message) { void* libsdl2 = dlopen("libSDL2.so", RTLD_LAZY | RTLD_LOCAL); From 13777cab66a915a412b8a2da945942c4bbd0319d Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Fri, 30 Jun 2023 13:49:37 +0200 Subject: [PATCH 05/16] Implement argument parsing and logging initialization for GNU Linux --- src/xenia/base/main_gnulinux.cc | 84 +++++++++++++++++++++++++++++++++ src/xenia/base/main_gnulinux.h | 29 ++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 src/xenia/base/main_gnulinux.cc create mode 100644 src/xenia/base/main_gnulinux.h diff --git a/src/xenia/base/main_gnulinux.cc b/src/xenia/base/main_gnulinux.cc new file mode 100644 index 0000000000..bf40d30933 --- /dev/null +++ b/src/xenia/base/main_gnulinux.cc @@ -0,0 +1,84 @@ +/** +****************************************************************************** +* Xenia : Xbox 360 Emulator Research Project * +****************************************************************************** +* Copyright 2023 Marco Rodolfi. All rights reserved. * +* Released under the BSD license - see LICENSE in the root for more details. * +****************************************************************************** +*/ + +#include "main_gnulinux.h" +#include <filesystem> +#include <fstream> +#include <regex> +#include "cvar.h" +#include "logging.h" + +// Autogenerated by `xb premake`. +#include "build/version.h" + +namespace xe { + bool ParseGNULinuxLaunchArguments( + bool transparent_options, const std::string_view positional_usage, + const std::vector<std::string>& positional_options, + std::vector<std::string>* args_out) { + auto size = static_cast<std::streamsize>(std::filesystem::file_size("/proc/self/cmdline")); + std::ifstream ifs("/proc/self/cmdline", std::ifstream::in); + std::regex del("\0"); + std::string raw_par(size, '\0'); + std::vector<std::string> arg_split(size); + int argc = 0; + while (ifs.read(raw_par.data(), size)) { + auto split_arg = std::vector<std::string>(std::sregex_token_iterator(raw_par.begin(), raw_par.end(), del, -1), + std::sregex_token_iterator()); + bool par_found = false; + for (auto & elem : arg_split){ + if (elem.find("xenia-app")){ + par_found = true; + } else if (par_found){ + arg_split.push_back(elem); + argc += 1; + } + } + } + ifs.close(); + + char** argv = reinterpret_cast<char**>(alloca(sizeof(char*) * argc)); + for (int n = 0; n < argc; n++) { + size_t len = strlen(arg_split[n].c_str()); + argv[n] = reinterpret_cast<char*>(alloca(sizeof(char) * (len + 1))); + strcpy(argv[n], arg_split[n].c_str()); + } + if (!transparent_options) { + cvar::ParseLaunchArguments(argc, argv, positional_usage, + positional_options); + } + if (args_out) { + args_out->clear(); + for (int n = 0; n < argc; n++) { + args_out->push_back(std::string(argv[n])); + } + } + + return true; + } + int InitializeGNULinuxApp(const std::string_view app_name) { + // Initialize logging. Needs parsed FLAGS. + xe::InitializeLogging(app_name); + + // Print version info. + XELOGI( + "Build: " + #ifdef XE_BUILD_IS_PR + "PR#" XE_BUILD_PR_NUMBER " " XE_BUILD_PR_REPO " " XE_BUILD_PR_BRANCH + "@" XE_BUILD_PR_COMMIT_SHORT " against " + #endif + XE_BUILD_BRANCH "@" XE_BUILD_COMMIT_SHORT " on " XE_BUILD_DATE); + + return 0; + } + + void ShutdownGNULinuxApp() { + xe::ShutdownLogging(); + } +} \ No newline at end of file diff --git a/src/xenia/base/main_gnulinux.h b/src/xenia/base/main_gnulinux.h new file mode 100644 index 0000000000..529605e875 --- /dev/null +++ b/src/xenia/base/main_gnulinux.h @@ -0,0 +1,29 @@ +/** +****************************************************************************** +* Xenia : Xbox 360 Emulator Research Project * +****************************************************************************** +* Copyright 2021 Ben Vanik. All rights reserved. * +* Released under the BSD license - see LICENSE in the root for more details. * +****************************************************************************** +*/ + +#ifndef XENIA_BASE_MAIN_GNULINUX_H_ +#define XENIA_BASE_MAIN_GNULINUX_H_ + +#include <string> +#include <vector> + +namespace xe { + +// Functions for calling in both windowed and console entry points. +bool ParseGNULinuxLaunchArguments( + bool transparent_options, std::string_view positional_usage, + const std::vector<std::string>& positional_options, + std::vector<std::string>* args_out); +// InitializeWin32App uses cvars, call ParseWin32LaunchArguments before. +int InitializeGNULinuxApp(std::string_view app_name); +void ShutdownGNULinuxApp(); + +} // namespace xe + +#endif // XENIA_BASE_MAIN_GNULINUX_H_ From 7b5d3a99231858a09822328e37e6b738bc70098d Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 09:25:51 +0200 Subject: [PATCH 06/16] Remove unneeded argument parting in main_gnulinux since it's already handled in the actual main portion. --- src/xenia/base/main_gnulinux.cc | 44 --------------------------------- 1 file changed, 44 deletions(-) diff --git a/src/xenia/base/main_gnulinux.cc b/src/xenia/base/main_gnulinux.cc index bf40d30933..9165746c79 100644 --- a/src/xenia/base/main_gnulinux.cc +++ b/src/xenia/base/main_gnulinux.cc @@ -18,50 +18,6 @@ #include "build/version.h" namespace xe { - bool ParseGNULinuxLaunchArguments( - bool transparent_options, const std::string_view positional_usage, - const std::vector<std::string>& positional_options, - std::vector<std::string>* args_out) { - auto size = static_cast<std::streamsize>(std::filesystem::file_size("/proc/self/cmdline")); - std::ifstream ifs("/proc/self/cmdline", std::ifstream::in); - std::regex del("\0"); - std::string raw_par(size, '\0'); - std::vector<std::string> arg_split(size); - int argc = 0; - while (ifs.read(raw_par.data(), size)) { - auto split_arg = std::vector<std::string>(std::sregex_token_iterator(raw_par.begin(), raw_par.end(), del, -1), - std::sregex_token_iterator()); - bool par_found = false; - for (auto & elem : arg_split){ - if (elem.find("xenia-app")){ - par_found = true; - } else if (par_found){ - arg_split.push_back(elem); - argc += 1; - } - } - } - ifs.close(); - - char** argv = reinterpret_cast<char**>(alloca(sizeof(char*) * argc)); - for (int n = 0; n < argc; n++) { - size_t len = strlen(arg_split[n].c_str()); - argv[n] = reinterpret_cast<char*>(alloca(sizeof(char) * (len + 1))); - strcpy(argv[n], arg_split[n].c_str()); - } - if (!transparent_options) { - cvar::ParseLaunchArguments(argc, argv, positional_usage, - positional_options); - } - if (args_out) { - args_out->clear(); - for (int n = 0; n < argc; n++) { - args_out->push_back(std::string(argv[n])); - } - } - - return true; - } int InitializeGNULinuxApp(const std::string_view app_name) { // Initialize logging. Needs parsed FLAGS. xe::InitializeLogging(app_name); From 68f663c66e97bb39d4f38675f1c86b06a1169954 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 09:26:40 +0200 Subject: [PATCH 07/16] Remove unneeded argument parting in main_gnulinux since it's already handled in the actual main portion. --- src/xenia/base/main_gnulinux.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/xenia/base/main_gnulinux.h b/src/xenia/base/main_gnulinux.h index 529605e875..e5af826a68 100644 --- a/src/xenia/base/main_gnulinux.h +++ b/src/xenia/base/main_gnulinux.h @@ -15,12 +15,6 @@ namespace xe { -// Functions for calling in both windowed and console entry points. -bool ParseGNULinuxLaunchArguments( - bool transparent_options, std::string_view positional_usage, - const std::vector<std::string>& positional_options, - std::vector<std::string>* args_out); -// InitializeWin32App uses cvars, call ParseWin32LaunchArguments before. int InitializeGNULinuxApp(std::string_view app_name); void ShutdownGNULinuxApp(); From 50d9004305302b178a3fe2d0aead984bf8d2a3cb Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 09:29:29 +0200 Subject: [PATCH 08/16] Generic cleanup --- src/xenia/base/console_posix.cc | 2 +- src/xenia/base/exception_handler_posix.cc | 2 +- src/xenia/base/mapped_memory_posix.cc | 2 +- src/xenia/base/threading_posix.cc | 36 ++++++++++++----------- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/xenia/base/console_posix.cc b/src/xenia/base/console_posix.cc index 0f8cf38f97..adfa4c73cb 100644 --- a/src/xenia/base/console_posix.cc +++ b/src/xenia/base/console_posix.cc @@ -7,7 +7,7 @@ ****************************************************************************** */ -#include <stdio.h> +#include <cstdio> #include <unistd.h> #include "xenia/base/console.h" diff --git a/src/xenia/base/exception_handler_posix.cc b/src/xenia/base/exception_handler_posix.cc index 0b11003ffa..d7a8a2d5ab 100644 --- a/src/xenia/base/exception_handler_posix.cc +++ b/src/xenia/base/exception_handler_posix.cc @@ -9,7 +9,7 @@ #include "xenia/base/exception_handler.h" -#include <signal.h> +#include <csignal> #include <ucontext.h> #include <cstdint> diff --git a/src/xenia/base/mapped_memory_posix.cc b/src/xenia/base/mapped_memory_posix.cc index 330ced53fa..09cd5a962a 100644 --- a/src/xenia/base/mapped_memory_posix.cc +++ b/src/xenia/base/mapped_memory_posix.cc @@ -48,7 +48,7 @@ class PosixMappedMemory : public MappedMemory { size_t map_length = length; if (!length) { - struct stat64 file_stat; + struct stat64 file_stat{}; if (fstat64(file_descriptor, &file_stat)) { close(file_descriptor); return nullptr; diff --git a/src/xenia/base/threading_posix.cc b/src/xenia/base/threading_posix.cc index 604e332d5c..4e041ef67f 100644 --- a/src/xenia/base/threading_posix.cc +++ b/src/xenia/base/threading_posix.cc @@ -16,7 +16,7 @@ #include <pthread.h> #include <sched.h> -#include <signal.h> +#include <csignal> #include <sys/eventfd.h> #include <sys/syscall.h> #include <sys/time.h> @@ -129,8 +129,10 @@ void install_signal_handler(SignalType type) { signal_handler_installed[static_cast<size_t>(type)] = true; } -// TODO(dougvj) -void EnableAffinityConfiguration() {} +// FIXME: The process is already enabled to run all all cores of the machine +// by default. +void EnableAffinityConfiguration() { +} // uint64_t ticks() { return mach_absolute_time(); } @@ -219,7 +221,7 @@ class PosixConditionBase { static std::pair<WaitResult, size_t> WaitMultiple( std::vector<PosixConditionBase*>&& handles, bool wait_all, std::chrono::milliseconds timeout) { - assert_true(handles.size() > 0); + assert_true(!handles.empty()); // Construct a condition for all or any depending on wait_all std::function<bool()> predicate; @@ -267,10 +269,10 @@ class PosixConditionBase { } } - virtual void* native_handle() const { return cond_.native_handle(); } + [[nodiscard]] virtual void* native_handle() const { return cond_.native_handle(); } protected: - inline virtual bool signaled() const = 0; + [[nodiscard]] inline virtual bool signaled() const = 0; inline virtual void post_execution() = 0; static std::condition_variable cond_; static std::mutex mutex_; @@ -306,7 +308,7 @@ class PosixCondition<Event> : public PosixConditionBase { } private: - inline bool signaled() const override { return signal_; } + [[nodiscard]] inline bool signaled() const override { return signal_; } inline void post_execution() override { if (!manual_reset_) { signal_ = false; @@ -336,7 +338,7 @@ class PosixCondition<Semaphore> : public PosixConditionBase { } private: - inline bool signaled() const override { return count_ > 0; } + [[nodiscard]] inline bool signaled() const override { return count_ > 0; } inline void post_execution() override { count_--; cond_.notify_all(); @@ -370,10 +372,10 @@ class PosixCondition<Mutant> : public PosixConditionBase { return false; } - void* native_handle() const override { return mutex_.native_handle(); } + [[nodiscard]] void* native_handle() const override { return mutex_.native_handle(); } private: - inline bool signaled() const override { + [[nodiscard]] inline bool signaled() const override { return count_ == 0 || owner_ == std::this_thread::get_id(); } inline void post_execution() override { @@ -429,7 +431,7 @@ class PosixCondition<Timer> : public PosixConditionBase { } } - void* native_handle() const override { + [[nodiscard]] void* native_handle() const override { assert_always(); return nullptr; } @@ -451,7 +453,7 @@ class PosixCondition<Timer> : public PosixConditionBase { } private: - inline bool signaled() const override { return signal_; } + [[nodiscard]] inline bool signaled() const override { return signal_; } inline void post_execution() override { if (!manual_reset_) { signal_ = false; @@ -601,7 +603,7 @@ class PosixCondition<Thread> : public PosixConditionBase { uint32_t system_id() const { return static_cast<uint32_t>(thread_); } - uint64_t affinity_mask() { + uint64_t affinity_mask() const { WaitStarted(); cpu_set_t cpu_set; #if XE_PLATFORM_ANDROID @@ -623,7 +625,7 @@ class PosixCondition<Thread> : public PosixConditionBase { return result; } - void set_affinity_mask(uint64_t mask) { + void set_affinity_mask(uint64_t mask) const { WaitStarted(); cpu_set_t cpu_set; CPU_ZERO(&cpu_set); @@ -644,7 +646,7 @@ class PosixCondition<Thread> : public PosixConditionBase { #endif } - int priority() { + int priority() const { WaitStarted(); int policy; sched_param param{}; @@ -656,7 +658,7 @@ class PosixCondition<Thread> : public PosixConditionBase { return param.sched_priority; } - void set_priority(int new_priority) { + void set_priority(int new_priority) const { WaitStarted(); sched_param param{}; param.sched_priority = new_priority; @@ -817,7 +819,7 @@ class PosixConditionHandle : public T, public PosixWaitHandle { ~PosixConditionHandle() override = default; PosixCondition<T>& condition() override { return handle_; } - void* native_handle() const override { return handle_.native_handle(); } + [[nodiscard]] void* native_handle() const override { return handle_.native_handle(); } protected: PosixCondition<T> handle_; From 48df797ec683c1f642cddae96c4de1cd9c246fa8 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 09:30:36 +0200 Subject: [PATCH 09/16] Additional memory checks for posix systems --- src/xenia/base/memory_posix.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/xenia/base/memory_posix.cc b/src/xenia/base/memory_posix.cc index d3043bfc2a..30a8ceb0ec 100644 --- a/src/xenia/base/memory_posix.cc +++ b/src/xenia/base/memory_posix.cc @@ -61,7 +61,7 @@ void AndroidShutdown() { size_t page_size() { return getpagesize(); } size_t allocation_granularity() { return page_size(); } -uint32_t ToPosixProtectFlags(PageAccess access) { +int32_t ToPosixProtectFlags(PageAccess access) { switch (access) { case PageAccess::kNoAccess: return PROT_NONE; @@ -84,9 +84,9 @@ bool IsWritableExecutableMemorySupported() { return true; } void* AllocFixed(void* base_address, size_t length, AllocationType allocation_type, PageAccess access) { // mmap does not support reserve / commit, so ignore allocation_type. - uint32_t prot = ToPosixProtectFlags(access); + int32_t prot = ToPosixProtectFlags(access); void * result; - if (base_address) { + if (base_address != nullptr) { result = mmap(base_address, length, prot, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0); } else { @@ -94,6 +94,7 @@ void* AllocFixed(void* base_address, size_t length, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); } if (result == MAP_FAILED) { + assert_always(); return nullptr; } else { return result; @@ -110,7 +111,7 @@ bool Protect(void* base_address, size_t length, PageAccess access, // Linux does not have a syscall to query memory permissions. assert_null(out_old_access); - uint32_t prot = ToPosixProtectFlags(access); + int32_t prot = ToPosixProtectFlags(access); return mprotect(base_address, length, prot) == 0; } @@ -183,7 +184,7 @@ void CloseFileMappingHandle(FileMappingHandle handle, void* MapFileView(FileMappingHandle handle, void* base_address, size_t length, PageAccess access, size_t file_offset) { - uint32_t prot = ToPosixProtectFlags(access); + int32_t prot = ToPosixProtectFlags(access); return mmap64(base_address, length, prot, MAP_PRIVATE | MAP_ANONYMOUS, handle, file_offset); } From 103ed1a53c71ae701e92518916831032cd16e737 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 13:09:58 +0200 Subject: [PATCH 10/16] Stylisting fixes --- premake5.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/premake5.lua b/premake5.lua index f547d867cf..406d6ca782 100644 --- a/premake5.lua +++ b/premake5.lua @@ -100,7 +100,7 @@ filter("configurations:Release") -- including handling of specials since games make assumptions about them. filter("platforms:Linux") system("linux") --- Ccache seems to randomly break the build process, disable it + -- Ccache seems to randomly break the build process, disable it defines({ "CCACHE_DISABLE=1" }) From fdd44e32a8c58b0050696594a55988ea5a538525 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 13:10:33 +0200 Subject: [PATCH 11/16] Implement ListDirectories and FilterByName in filesystem_posix.cc --- src/xenia/base/filesystem_posix.cc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/xenia/base/filesystem_posix.cc b/src/xenia/base/filesystem_posix.cc index 34b186a810..e38cc2a142 100644 --- a/src/xenia/base/filesystem_posix.cc +++ b/src/xenia/base/filesystem_posix.cc @@ -246,6 +246,29 @@ std::vector<FileInfo> ListFiles(const std::filesystem::path& path) { return result; } +std::vector<FileInfo> ListDirectories(const std::filesystem::path& path) { + std::vector<FileInfo> files = ListFiles(path); + std::vector<FileInfo> directories = {}; + + std::copy_if( + files.cbegin(), files.cend(), std::back_inserter(directories), + [](FileInfo file) { return file.type == FileInfo::Type::kDirectory; }); + + return directories; +} + +std::vector<FileInfo> FilterByName(const std::vector<FileInfo>& files, + const std::regex pattern) { + std::vector<FileInfo> filtered_entries = {}; + + std::copy_if(files.cbegin(), files.cend(), + std::back_inserter(filtered_entries), [pattern](FileInfo file) { + return std::regex_match(file.name.filename().string(), + pattern); + }); + + return filtered_entries; +} } // namespace filesystem } // namespace xe From f682c947ee4fdf126877e7f7cffe6315afe8d27c Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 13:11:01 +0200 Subject: [PATCH 12/16] Add AVX CPU checks for posix systems --- src/xenia/base/main_init_posix.cc | 39 ++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/xenia/base/main_init_posix.cc b/src/xenia/base/main_init_posix.cc index 28b9767310..0c6e50d14e 100644 --- a/src/xenia/base/main_init_posix.cc +++ b/src/xenia/base/main_init_posix.cc @@ -1,3 +1,9 @@ +#include <gtk/gtk.h> +#include <gdk/gdk.h> +#include <xbyak/xbyak/xbyak_util.h> + +#include "xenia/ui/window_gtk.h" + /** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * @@ -7,4 +13,35 @@ ****************************************************************************** */ -// Nothing. Stub. +class StartupCpuFeatureCheck { + public: + StartupCpuFeatureCheck() { + Xbyak::util::Cpu cpu; + const char* error_message = nullptr; + if (!cpu.has(Xbyak::util::Cpu::tAVX)) { + error_message = + "Your CPU does not support AVX, which is required by Xenia. See " + "the " + "FAQ for system requirements at https://xenia.jp"; + } + if (error_message == nullptr) { + return; + } else { + GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT; + auto dialog = + gtk_message_dialog_new(nullptr, flags, GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE,error_message); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + exit(1); + } + } +}; + +// This is a hack to get an instance of StartupAvxCheck +// constructed before any initialization code, +// where the AVX check then happens in the constructor. +// Ref: +// https://reviews.llvm.org/D12689#243295 +__attribute__((init_priority(101))) +static StartupCpuFeatureCheck gStartupAvxCheck; \ No newline at end of file From 45e26333db6fc54623bf3041239690b0613165a4 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 13:11:54 +0200 Subject: [PATCH 13/16] Redirect console_app_main_posix.cc to a function equivalent call for posix systems --- src/xenia/base/console_app_main_posix.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/xenia/base/console_app_main_posix.cc b/src/xenia/base/console_app_main_posix.cc index 29a3ae6abd..cb24c36623 100644 --- a/src/xenia/base/console_app_main_posix.cc +++ b/src/xenia/base/console_app_main_posix.cc @@ -12,7 +12,7 @@ #include "xenia/base/console_app_main.h" #include "xenia/base/cvar.h" -#include "xenia/base/logging.h" +#include "xenia/base/main_gnulinux.h" extern "C" int main(int argc, char** argv) { xe::ConsoleAppEntryInfo entry_info = xe::GetConsoleAppEntryInfo(); @@ -23,7 +23,7 @@ extern "C" int main(int argc, char** argv) { } // Initialize logging. Needs parsed cvars. - xe::InitializeLogging(entry_info.name); + xe::InitializeGNULinuxApp(entry_info.name); std::vector<std::string> args; for (int n = 0; n < argc; n++) { @@ -32,7 +32,7 @@ extern "C" int main(int argc, char** argv) { int result = entry_info.entry_point(args); - xe::ShutdownLogging(); + xe::ShutdownGNULinuxApp(); return result; } From e07ea71be0aaa0177959ae18f6a1d8fe03499902 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 13:28:21 +0200 Subject: [PATCH 14/16] Implement message box disclaimer for posix systems --- src/xenia/emulator.cc | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index f929d8d4a2..f902831cf1 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -12,6 +12,10 @@ #include <algorithm> #include <cinttypes> +#ifdef XE_PLATFORM_LINUX +#include "xenia/ui/window_gtk.h" +#endif + #include "config.h" #include "third_party/fmt/include/fmt/format.h" #include "xenia/apu/audio_system.h" @@ -137,6 +141,28 @@ Emulator::Emulator(const std::filesystem::path& command_line, SetPersistentEmulatorFlags(persistent_flags | EmulatorFlagDisclaimerAcknowledged); } +#else + uint64_t persistent_flags = GetPersistentEmulatorFlags(); + if (!(persistent_flags & EmulatorFlagDisclaimerAcknowledged)) { + auto dialog = + gtk_message_dialog_new( + nullptr, GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION,GTK_BUTTONS_YES_NO, + "DISCLAIMER: Xenia is not for enabling illegal activity, and " + "support is unavailable for illegally obtained software.\n\n" + "Please respect this policy as no further reminders will be " + "given.\n\nThe quickstart guide explains how to use digital or " + "physical games from your Xbox 360 console.\n\nWould you like " + "to open it?"); + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) { + LaunchWebBrowser( + "https://github.com/xenia-project/xenia/wiki/" + "Quickstart#how-to-rip-games"); + }; + gtk_widget_destroy(dialog); + SetPersistentEmulatorFlags(persistent_flags | + EmulatorFlagDisclaimerAcknowledged); + } #endif } From 61ae650c037ef97218659fa1250a03a5e8288ccd Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 13:36:09 +0200 Subject: [PATCH 15/16] Now the achievement code compiles fine on linux, remove the ifdefs --- src/xenia/kernel/achievement_manager.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/xenia/kernel/achievement_manager.cc b/src/xenia/kernel/achievement_manager.cc index 6217a2795d..2f66ea9a47 100644 --- a/src/xenia/kernel/achievement_manager.cc +++ b/src/xenia/kernel/achievement_manager.cc @@ -53,14 +53,11 @@ void AchievementManager::EarnAchievement(uint64_t xuid, uint32_t title_id, if (!cvars::show_achievement_notification) { continue; } - //FIXME(RodoMa92): This call fails to compile under linux, disabled for now -#ifdef XE_PLATFORM_WINDOWS app_context.CallInUIThread([imgui_drawer, description]() { new ui::AchievementNotificationWindow( imgui_drawer, "Achievement unlocked", description, 0, kernel_state()->notification_position_); }); -#endif } } } From cb38522908a6e2d17f1b23caadd14fcb6cc26cf0 Mon Sep 17 00:00:00 2001 From: RodoMa92 <marco.rodolfi@tuta.io> Date: Sat, 12 Aug 2023 14:01:09 +0200 Subject: [PATCH 16/16] Update copyright year --- src/xenia/app/emulator_window.cc | 2 +- src/xenia/apu/conversion.h | 2 +- src/xenia/apu/xma_context.cc | 2 +- src/xenia/base/clock_posix.cc | 2 +- src/xenia/base/console_app_main_posix.cc | 2 +- src/xenia/base/console_posix.cc | 2 +- src/xenia/base/demangle.h | 2 +- src/xenia/base/demangle_posix.cc | 2 +- src/xenia/base/demangle_win.cc | 2 +- src/xenia/base/exception_handler_posix.cc | 2 +- src/xenia/base/filesystem_posix.cc | 2 +- src/xenia/base/main_gnulinux.cc | 2 +- src/xenia/base/main_gnulinux.h | 2 +- src/xenia/base/main_init_posix.cc | 17 ++++++++--------- src/xenia/base/mapped_memory_posix.cc | 2 +- src/xenia/base/memory.cc | 2 +- src/xenia/base/memory.h | 2 +- src/xenia/base/memory_posix.cc | 2 +- src/xenia/base/platform.h | 2 +- src/xenia/base/string_buffer.cc | 2 +- src/xenia/base/system_gnulinux.cc | 2 +- src/xenia/base/testing/filesystem_test.cc | 2 +- src/xenia/base/testing/memory_test.cc | 2 +- src/xenia/base/testing/string_test.cc | 2 +- src/xenia/base/testing/threading_test.cc | 2 +- src/xenia/base/threading_posix.cc | 2 +- src/xenia/cpu/backend/x64/x64_backend.cc | 2 +- src/xenia/cpu/backend/x64/x64_emitter.cc | 2 +- src/xenia/cpu/backend/x64/x64_emitter.h | 2 +- src/xenia/cpu/backend/x64/x64_tracers.cc | 2 +- src/xenia/cpu/backend/x64/x64_tracers.h | 2 +- src/xenia/cpu/hir/value.cc | 2 +- src/xenia/cpu/hir/value.h | 2 +- src/xenia/cpu/ppc/ppc_context.h | 2 +- src/xenia/cpu/ppc/ppc_frontend.cc | 2 +- src/xenia/cpu/ppc/ppc_translator.cc | 2 +- src/xenia/cpu/testing/util.h | 2 +- src/xenia/cpu/xex_module.cc | 2 +- src/xenia/emulator.cc | 2 +- src/xenia/gpu/command_processor.h | 2 +- src/xenia/gpu/draw_util.cc | 2 +- src/xenia/gpu/draw_util.h | 2 +- src/xenia/gpu/register_file.cc | 2 +- src/xenia/gpu/shared_memory.cc | 2 +- src/xenia/kernel/util/object_table.cc | 2 +- src/xenia/kernel/xam/xam_info.cc | 2 +- src/xenia/kernel/xobject.cc | 2 +- src/xenia/kernel/xsocket.cc | 2 +- src/xenia/memory.cc | 2 +- src/xenia/memory.h | 2 +- 50 files changed, 57 insertions(+), 58 deletions(-) diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index 4d5293c96b..de17f1d3fe 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/apu/conversion.h b/src/xenia/apu/conversion.h index 7318c54290..0ad1dcad01 100644 --- a/src/xenia/apu/conversion.h +++ b/src/xenia/apu/conversion.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2021 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/apu/xma_context.cc b/src/xenia/apu/xma_context.cc index d6473807e0..6cbfd23f64 100644 --- a/src/xenia/apu/xma_context.cc +++ b/src/xenia/apu/xma_context.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** -* Copyright 2021 Ben Vanik. All rights reserved. * +* Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/clock_posix.cc b/src/xenia/base/clock_posix.cc index 0ec830e90d..edd321efe7 100644 --- a/src/xenia/base/clock_posix.cc +++ b/src/xenia/base/clock_posix.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2021 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/console_app_main_posix.cc b/src/xenia/base/console_app_main_posix.cc index cb24c36623..f35212c370 100644 --- a/src/xenia/base/console_app_main_posix.cc +++ b/src/xenia/base/console_app_main_posix.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2021 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/console_posix.cc b/src/xenia/base/console_posix.cc index adfa4c73cb..bee4ac17f9 100644 --- a/src/xenia/base/console_posix.cc +++ b/src/xenia/base/console_posix.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2021 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/demangle.h b/src/xenia/base/demangle.h index 6fbdab9a9e..29162878af 100644 --- a/src/xenia/base/demangle.h +++ b/src/xenia/base/demangle.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/demangle_posix.cc b/src/xenia/base/demangle_posix.cc index 4e50e3dbb7..310edd5a9a 100644 --- a/src/xenia/base/demangle_posix.cc +++ b/src/xenia/base/demangle_posix.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/demangle_win.cc b/src/xenia/base/demangle_win.cc index 84a46a437e..6fe811fe82 100644 --- a/src/xenia/base/demangle_win.cc +++ b/src/xenia/base/demangle_win.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/exception_handler_posix.cc b/src/xenia/base/exception_handler_posix.cc index d7a8a2d5ab..5c659f6ad9 100644 --- a/src/xenia/base/exception_handler_posix.cc +++ b/src/xenia/base/exception_handler_posix.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/filesystem_posix.cc b/src/xenia/base/filesystem_posix.cc index e38cc2a142..b6327706dd 100644 --- a/src/xenia/base/filesystem_posix.cc +++ b/src/xenia/base/filesystem_posix.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/main_gnulinux.cc b/src/xenia/base/main_gnulinux.cc index 9165746c79..90e43a5be2 100644 --- a/src/xenia/base/main_gnulinux.cc +++ b/src/xenia/base/main_gnulinux.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** -* Copyright 2023 Marco Rodolfi. All rights reserved. * +* Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/main_gnulinux.h b/src/xenia/base/main_gnulinux.h index e5af826a68..937d7606c3 100644 --- a/src/xenia/base/main_gnulinux.h +++ b/src/xenia/base/main_gnulinux.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** -* Copyright 2021 Ben Vanik. All rights reserved. * +* Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/main_init_posix.cc b/src/xenia/base/main_init_posix.cc index 0c6e50d14e..1d125cc8e0 100644 --- a/src/xenia/base/main_init_posix.cc +++ b/src/xenia/base/main_init_posix.cc @@ -1,18 +1,17 @@ +/** +****************************************************************************** +* Xenia : Xbox 360 Emulator Research Project * +****************************************************************************** +* Copyright 2023 Ben Vanik. All rights reserved. * +* Released under the BSD license - see LICENSE in the root for more details. * +****************************************************************************** +*/ #include <gtk/gtk.h> #include <gdk/gdk.h> #include <xbyak/xbyak/xbyak_util.h> #include "xenia/ui/window_gtk.h" -/** - ****************************************************************************** - * Xenia : Xbox 360 Emulator Research Project * - ****************************************************************************** - * Copyright 2021 Ben Vanik. All rights reserved. * - * Released under the BSD license - see LICENSE in the root for more details. * - ****************************************************************************** - */ - class StartupCpuFeatureCheck { public: StartupCpuFeatureCheck() { diff --git a/src/xenia/base/mapped_memory_posix.cc b/src/xenia/base/mapped_memory_posix.cc index 09cd5a962a..4d2b760189 100644 --- a/src/xenia/base/mapped_memory_posix.cc +++ b/src/xenia/base/mapped_memory_posix.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/memory.cc b/src/xenia/base/memory.cc index c8fab9ad96..daf7fc7e3c 100644 --- a/src/xenia/base/memory.cc +++ b/src/xenia/base/memory.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/memory.h b/src/xenia/base/memory.h index e449746574..446e477b7b 100644 --- a/src/xenia/base/memory.h +++ b/src/xenia/base/memory.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/memory_posix.cc b/src/xenia/base/memory_posix.cc index 30a8ceb0ec..71110e9f28 100644 --- a/src/xenia/base/memory_posix.cc +++ b/src/xenia/base/memory_posix.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/platform.h b/src/xenia/base/platform.h index 0c7475b580..6a77aa749e 100644 --- a/src/xenia/base/platform.h +++ b/src/xenia/base/platform.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/string_buffer.cc b/src/xenia/base/string_buffer.cc index f94fd6c880..0fdb4b5b48 100644 --- a/src/xenia/base/string_buffer.cc +++ b/src/xenia/base/string_buffer.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/system_gnulinux.cc b/src/xenia/base/system_gnulinux.cc index 91ba0a580f..c8c84b353a 100644 --- a/src/xenia/base/system_gnulinux.cc +++ b/src/xenia/base/system_gnulinux.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/testing/filesystem_test.cc b/src/xenia/base/testing/filesystem_test.cc index 2829e6b9d5..6d7ca64cfb 100644 --- a/src/xenia/base/testing/filesystem_test.cc +++ b/src/xenia/base/testing/filesystem_test.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2019 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/testing/memory_test.cc b/src/xenia/base/testing/memory_test.cc index c670a65a24..6830547fb9 100644 --- a/src/xenia/base/testing/memory_test.cc +++ b/src/xenia/base/testing/memory_test.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/testing/string_test.cc b/src/xenia/base/testing/string_test.cc index 654f7d440a..ad1a1a50ed 100644 --- a/src/xenia/base/testing/string_test.cc +++ b/src/xenia/base/testing/string_test.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** -* Copyright 2019 Ben Vanik. All rights reserved. * +* Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/testing/threading_test.cc b/src/xenia/base/testing/threading_test.cc index f19af2647b..21d6677401 100644 --- a/src/xenia/base/testing/threading_test.cc +++ b/src/xenia/base/testing/threading_test.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** -* Copyright 2022 Ben Vanik. All rights reserved. * +* Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/base/threading_posix.cc b/src/xenia/base/threading_posix.cc index 4e041ef67f..e5c4c8cd41 100644 --- a/src/xenia/base/threading_posix.cc +++ b/src/xenia/base/threading_posix.cc @@ -129,7 +129,7 @@ void install_signal_handler(SignalType type) { signal_handler_installed[static_cast<size_t>(type)] = true; } -// FIXME: The process is already enabled to run all all cores of the machine +// FIXME: The process is already enabled to run on all cores of the machine // by default. void EnableAffinityConfiguration() { } diff --git a/src/xenia/cpu/backend/x64/x64_backend.cc b/src/xenia/cpu/backend/x64/x64_backend.cc index e05d5d6e7e..54a3ac62d3 100644 --- a/src/xenia/cpu/backend/x64/x64_backend.cc +++ b/src/xenia/cpu/backend/x64/x64_backend.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/backend/x64/x64_emitter.cc b/src/xenia/cpu/backend/x64/x64_emitter.cc index 7265eb8f4b..eade73f89a 100644 --- a/src/xenia/cpu/backend/x64/x64_emitter.cc +++ b/src/xenia/cpu/backend/x64/x64_emitter.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/backend/x64/x64_emitter.h b/src/xenia/cpu/backend/x64/x64_emitter.h index 1ddd44b5db..5811ed647f 100644 --- a/src/xenia/cpu/backend/x64/x64_emitter.h +++ b/src/xenia/cpu/backend/x64/x64_emitter.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/backend/x64/x64_tracers.cc b/src/xenia/cpu/backend/x64/x64_tracers.cc index 727808225e..31b1eb9781 100644 --- a/src/xenia/cpu/backend/x64/x64_tracers.cc +++ b/src/xenia/cpu/backend/x64/x64_tracers.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/backend/x64/x64_tracers.h b/src/xenia/cpu/backend/x64/x64_tracers.h index 4a6d0c18f6..12304c63fd 100644 --- a/src/xenia/cpu/backend/x64/x64_tracers.h +++ b/src/xenia/cpu/backend/x64/x64_tracers.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/hir/value.cc b/src/xenia/cpu/hir/value.cc index c05d442ac8..4c1f5b71a6 100644 --- a/src/xenia/cpu/hir/value.cc +++ b/src/xenia/cpu/hir/value.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/hir/value.h b/src/xenia/cpu/hir/value.h index 15eaf7827f..b9b718c15b 100644 --- a/src/xenia/cpu/hir/value.h +++ b/src/xenia/cpu/hir/value.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2013 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/ppc/ppc_context.h b/src/xenia/cpu/ppc/ppc_context.h index 5122b5673d..c78b4ce50c 100644 --- a/src/xenia/cpu/ppc/ppc_context.h +++ b/src/xenia/cpu/ppc/ppc_context.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/ppc/ppc_frontend.cc b/src/xenia/cpu/ppc/ppc_frontend.cc index d7d839573c..5ec46fe8a2 100644 --- a/src/xenia/cpu/ppc/ppc_frontend.cc +++ b/src/xenia/cpu/ppc/ppc_frontend.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2013 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/ppc/ppc_translator.cc b/src/xenia/cpu/ppc/ppc_translator.cc index d01213a07b..b7ea5cd389 100644 --- a/src/xenia/cpu/ppc/ppc_translator.cc +++ b/src/xenia/cpu/ppc/ppc_translator.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2013 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/testing/util.h b/src/xenia/cpu/testing/util.h index 34e80157bc..d6f40c930f 100644 --- a/src/xenia/cpu/testing/util.h +++ b/src/xenia/cpu/testing/util.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2014 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/cpu/xex_module.cc b/src/xenia/cpu/xex_module.cc index 2e7d2863da..be8f8429ba 100644 --- a/src/xenia/cpu/xex_module.cc +++ b/src/xenia/cpu/xex_module.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2021 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index f902831cf1..7b8f503812 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2021 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/gpu/command_processor.h b/src/xenia/gpu/command_processor.h index 7c2e5d3d63..b0a01d400a 100644 --- a/src/xenia/gpu/command_processor.h +++ b/src/xenia/gpu/command_processor.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/gpu/draw_util.cc b/src/xenia/gpu/draw_util.cc index 43413efb1d..0c61f4ed5f 100644 --- a/src/xenia/gpu/draw_util.cc +++ b/src/xenia/gpu/draw_util.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/gpu/draw_util.h b/src/xenia/gpu/draw_util.h index bff56c6b2c..524850d071 100644 --- a/src/xenia/gpu/draw_util.h +++ b/src/xenia/gpu/draw_util.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/gpu/register_file.cc b/src/xenia/gpu/register_file.cc index ecc21c6dbd..9ba9d6a5ff 100644 --- a/src/xenia/gpu/register_file.cc +++ b/src/xenia/gpu/register_file.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2014 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/gpu/shared_memory.cc b/src/xenia/gpu/shared_memory.cc index 416a27bd95..7d68c38e9f 100644 --- a/src/xenia/gpu/shared_memory.cc +++ b/src/xenia/gpu/shared_memory.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/kernel/util/object_table.cc b/src/xenia/kernel/util/object_table.cc index cf707ea10d..8875264d99 100644 --- a/src/xenia/kernel/util/object_table.cc +++ b/src/xenia/kernel/util/object_table.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/kernel/xam/xam_info.cc b/src/xenia/kernel/xam/xam_info.cc index f749251261..3cd20fe0ac 100644 --- a/src/xenia/kernel/xam/xam_info.cc +++ b/src/xenia/kernel/xam/xam_info.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/kernel/xobject.cc b/src/xenia/kernel/xobject.cc index 7a0fd0ec52..a2a9290e8a 100644 --- a/src/xenia/kernel/xobject.cc +++ b/src/xenia/kernel/xobject.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2022 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/kernel/xsocket.cc b/src/xenia/kernel/xsocket.cc index 6667ab8100..01c3df5315 100644 --- a/src/xenia/kernel/xsocket.cc +++ b/src/xenia/kernel/xsocket.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2013 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/memory.cc b/src/xenia/memory.cc index b67a38ad64..b63f21b81c 100644 --- a/src/xenia/memory.cc +++ b/src/xenia/memory.cc @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ diff --git a/src/xenia/memory.h b/src/xenia/memory.h index 992f859a3f..60ef96eef7 100644 --- a/src/xenia/memory.h +++ b/src/xenia/memory.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2020 Ben Vanik. All rights reserved. * + * Copyright 2023 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor