diff options
| author | lizzie <lizzie@eden-emu.dev> | 2025-10-22 04:53:40 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2025-10-22 04:53:40 +0200 |
| commit | 87cacbeed49facf18355c55cc93d0a2a0142be09 (patch) | |
| tree | 320ab5933dd97b5f54f5fcc2cb4ed775587c9cbf /src/common | |
| parent | 992bae4e2a14ca2547c09637b7dc6fc5f73b353a (diff) | |
[compat] HaikuOS port (#2805)
Still had the issues with libusb, but that should get solved with the other PRs anyways
Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2805
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: crueter <crueter@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/host_memory.cpp | 31 | ||||
| -rw-r--r-- | src/common/settings.cpp | 2 | ||||
| -rw-r--r-- | src/common/settings.h | 2 | ||||
| -rw-r--r-- | src/common/thread.cpp | 62 | ||||
| -rw-r--r-- | src/common/virtual_buffer.cpp | 16 |
5 files changed, 41 insertions, 72 deletions
diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 3838c12903..6e47fa286d 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -12,7 +12,7 @@ #include <windows.h> #include "common/dynamic_library.h" -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__sun__) || defined(__APPLE__) // ^^^ Windows ^^^ vvv POSIX vvv +#else // ^^^ Windows ^^^ vvv POSIX vvv #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -394,7 +394,7 @@ private: std::unordered_map<size_t, size_t> placeholder_host_pointers; ///< Placeholder backing offset }; -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__sun__) || defined(__APPLE__) // ^^^ Windows ^^^ vvv POSIX vvv +#else // ^^^ Windows ^^^ vvv POSIX vvv #ifdef ARCHITECTURE_arm64 @@ -679,32 +679,7 @@ private: FreeRegionManager free_manager{}; }; -#else // ^^^ POSIX ^^^ vvv Generic vvv - -class HostMemory::Impl { -public: - explicit Impl([[maybe_unused]] size_t backing_size, [[maybe_unused]] size_t virtual_size) { - // This is just a place holder. - ASSERT_MSG(false, "Please implement fastmem in a proper way on your platform."); - } - - void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perm) {} - - void Unmap(size_t virtual_offset, size_t length) {} - - void Protect(size_t virtual_offset, size_t length, bool read, bool write, bool execute) {} - - bool ClearBackingRegion(size_t physical_offset, size_t length) { - return false; - } - - void EnableDirectMappedAddress() {} - - u8* backing_base{nullptr}; - u8* virtual_base{nullptr}; -}; - -#endif // ^^^ Generic ^^^ +#endif // ^^^ POSIX ^^^ HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_) : backing_size(backing_size_), virtual_size(virtual_size_) { diff --git a/src/common/settings.cpp b/src/common/settings.cpp index e817acc36e..0022d242c3 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -169,7 +169,7 @@ bool IsFastmemEnabled() { if (values.cpu_accuracy.GetValue() == CpuAccuracy::Unsafe) { return bool(values.cpuopt_unsafe_host_mmu); } -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) return false; #else return true; diff --git a/src/common/settings.h b/src/common/settings.h index 4eea9cf265..1dc3bdca20 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -296,7 +296,7 @@ struct Values { Category::CpuDebug}; SwitchableSetting<bool> cpuopt_unsafe_host_mmu{linkage, -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) false, #else true, diff --git a/src/common/thread.cpp b/src/common/thread.cpp index 2de7465a22..3f0fb48c25 100644 --- a/src/common/thread.cpp +++ b/src/common/thread.cpp @@ -11,6 +11,8 @@ #include "common/thread.h" #ifdef __APPLE__ #include <mach/mach.h> +#elif defined(__HAIKU__) +#include <kernel/OS.h> #elif defined(_WIN32) #include <windows.h> #include "common/string_util.h" @@ -31,43 +33,38 @@ namespace Common { -#ifdef _WIN32 - void SetCurrentThreadPriority(ThreadPriority new_priority) { - auto handle = GetCurrentThread(); - int windows_priority = 0; - switch (new_priority) { - case ThreadPriority::Low: - windows_priority = THREAD_PRIORITY_BELOW_NORMAL; - break; - case ThreadPriority::Normal: - windows_priority = THREAD_PRIORITY_NORMAL; - break; - case ThreadPriority::High: - windows_priority = THREAD_PRIORITY_ABOVE_NORMAL; - break; - case ThreadPriority::VeryHigh: - windows_priority = THREAD_PRIORITY_HIGHEST; - break; - case ThreadPriority::Critical: - windows_priority = THREAD_PRIORITY_TIME_CRITICAL; - break; - default: - windows_priority = THREAD_PRIORITY_NORMAL; - break; - } - SetThreadPriority(handle, windows_priority); -} - +#ifdef _WIN32 + int windows_priority = [&]() { + switch (new_priority) { + case ThreadPriority::Low: return THREAD_PRIORITY_BELOW_NORMAL; + case ThreadPriority::Normal: return THREAD_PRIORITY_NORMAL; + case ThreadPriority::High: return THREAD_PRIORITY_ABOVE_NORMAL; + case ThreadPriority::VeryHigh: return THREAD_PRIORITY_HIGHEST; + case ThreadPriority::Critical: return THREAD_PRIORITY_TIME_CRITICAL; + default: return THREAD_PRIORITY_NORMAL; + } + }(); + SetThreadPriority(GetCurrentThread(), windows_priority); +#elif defined(__HAIKU__) + // TODO: We have priorities for 3D rendering applications - may help lavapipe? + int priority = [&]() { + switch (new_priority) { + case ThreadPriority::Low: return B_LOW_PRIORITY; + case ThreadPriority::Normal: return B_NORMAL_PRIORITY; + case ThreadPriority::High: return B_DISPLAY_PRIORITY; + case ThreadPriority::VeryHigh: return B_URGENT_DISPLAY_PRIORITY; + case ThreadPriority::Critical: return B_URGENT_PRIORITY; + default: return B_NORMAL_PRIORITY; + } + }(); + set_thread_priority(find_thread(NULL), priority); #else - -void SetCurrentThreadPriority(ThreadPriority new_priority) { pthread_t this_thread = pthread_self(); - const auto scheduling_type = SCHED_OTHER; s32 max_prio = sched_get_priority_max(scheduling_type); s32 min_prio = sched_get_priority_min(scheduling_type); - u32 level = (std::max)(static_cast<u32>(new_priority) + 1, 4U); + u32 level = (std::max)(u32(new_priority) + 1, 4U); struct sched_param params; if (max_prio > min_prio) { @@ -77,9 +74,8 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) { } pthread_setschedparam(this_thread, scheduling_type, ¶ms); -} - #endif +} #ifdef _MSC_VER diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index dea6de99f0..55ddfc243a 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -14,24 +17,19 @@ namespace Common { void* AllocateMemoryPages(std::size_t size) noexcept { #ifdef _WIN32 - void* base{VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE)}; + void* base = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); #else - void* base{mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0)}; - - if (base == MAP_FAILED) { + void* base = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + if (base == MAP_FAILED) base = nullptr; - } #endif - ASSERT(base); - return base; } void FreeMemoryPages(void* base, [[maybe_unused]] std::size_t size) noexcept { - if (!base) { + if (!base) return; - } #ifdef _WIN32 ASSERT(VirtualFree(base, 0, MEM_RELEASE)); #else |
