Index: head/emulators/rpcs3/Makefile =================================================================== --- head/emulators/rpcs3/Makefile (revision 512083) +++ head/emulators/rpcs3/Makefile (revision 512084) @@ -1,90 +1,90 @@ # $FreeBSD$ PORTNAME= rpcs3 DISTVERSIONPREFIX= v -DISTVERSION= 0.0.7-8690 # git rev-list --count HEAD -DISTVERSIONSUFFIX= -g27af75fe7 +DISTVERSION= 0.0.7-8710 # git rev-list --count HEAD +DISTVERSIONSUFFIX= -gfb8e70d7f CATEGORIES= emulators MAINTAINER= jbeich@FreeBSD.org COMMENT= PS3 emulator/debugger LICENSE= BSD3CLAUSE BSL GPLv2 MIT ZLIB LICENSE_COMB= multi LICENSE_FILE_BSD3CLAUSE=${WRKSRC_cereal}/LICENSE LICENSE_FILE_MIT= ${WRKSRC_GSL}/LICENSE LICENSE_FILE_ZLIB= ${WRKSRC_asmjit}/LICENSE.md LIB_DEPENDS= libpng.so:graphics/png \ libavcodec.so:multimedia/ffmpeg ONLY_FOR_ARCHS= amd64 ONLY_FOR_ARCHS_REASON= requires int128 and SSE2 USE_GITHUB= yes GH_ACCOUNT= RPCS3 GH_TUPLE= RPCS3:hidapi:hidapi-0.8.0-rc1-27-g9220f5e:hidapi/3rdparty/hidapi \ RPCS3:llvm:b860b5e8f4ee:llvm/llvm \ Cyan4973:xxHash:v0.6.5:xxHash/3rdparty/xxHash \ jbeder:yaml-cpp:yaml-cpp-0.6.2-23-geca9cfd:yamlcpp/3rdparty/yaml-cpp \ kobalicek:asmjit:fc251c9:asmjit/asmjit \ KhronosGroup:glslang:7.11.3214:glslang/Vulkan/glslang \ Microsoft:GSL:v2.0.0:GSL/3rdparty/GSL \ USCiLab:cereal:v1.2.0:cereal/3rdparty/cereal \ zeux:pugixml:v1.9-51-g8bf806c:pugixml/3rdparty/pugixml USES= cmake compiler:c++17-lang iconv:wchar_t localbase:ldflags \ openal:soft pkgconfig qt:5 USE_GL= gl glew USE_QT= qmake_build buildtools_build core dbus declarative gui network widgets USE_XORG= x11 CMAKE_ON= CMAKE_SKIP_RPATH USE_SYSTEM_FFMPEG USE_SYSTEM_LIBPNG CMAKE_OFF= USE_NATIVE_INSTRUCTIONS LDFLAGS+= -Wl,--as-needed # GLU # XXX Drop after FreeBSD 12.0 EOL .if exists(/usr/lib/clang/6.0.1) LLD_UNSAFE= yes # XXX ports/219089 .endif # XXX Remove after FreeBSD 11.2/12.0 reach EOL i.e., around 2020-02-01 .if !exists(/usr/include/c++/v1/charconv) && exists(/usr/lib/libc++.so) EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-revert-f9ad6358563b EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-revert-4504ac2d1248 EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-revert-5bd17a44c972 .endif OPTIONS_DEFINE= ALSA EVDEV GDB LLVM PULSEAUDIO VULKAN OPTIONS_DEFAULT=LLVM VULKAN ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib ALSA_RUN_DEPENDS= ${LOCALBASE}/lib/alsa-lib/libasound_module_pcm_oss.so:audio/alsa-plugins ALSA_CMAKE_BOOL= USE_ALSA EVDEV_DESC= libevdev-based joystick support EVDEV_CMAKE_BOOL= USE_LIBEVDEV EVDEV_BUILD_DEPENDS= evdev-proto>0:devel/evdev-proto EVDEV_LIB_DEPENDS= libevdev.so:devel/libevdev GDB_DESC= GDB remote stub (powerpc64 target) GDB_CMAKE_BOOL= WITH_GDB GDB_BROKEN= https://github.com/RPCS3/rpcs3/issues/5946 LLVM_DESC= LLVM-based PPU recompiler LLVM_CMAKE_BOOL_OFF= WITHOUT_LLVM PULSEAUDIO_LIB_DEPENDS= libpulse-simple.so:audio/pulseaudio PULSEAUDIO_CMAKE_BOOL= USE_PULSE VULKAN_DESC= Vulkan renderer VULKAN_BUILD_DEPENDS= ${LOCALBASE}/include/vulkan/vulkan.h:devel/vulkan-headers VULKAN_LIB_DEPENDS= libvulkan.so:graphics/vulkan-loader VULKAN_CMAKE_BOOL= USE_VULKAN post-patch: @${REINPLACE_CMD} -e '/GIT_BRANCH/s/unknown/master/' \ -e '/GIT_TAG/s/unknown/${GH_TAGNAME:C/-.*//}/' \ -e '/GIT_VERSION/s/unknown/${GH_TAGNAME:C/[^-]*-//}/' \ ${WRKSRC}/${PORTNAME}/git-version.cmake .include Index: head/emulators/rpcs3/distinfo =================================================================== --- head/emulators/rpcs3/distinfo (revision 512083) +++ head/emulators/rpcs3/distinfo (revision 512084) @@ -1,21 +1,21 @@ -TIMESTAMP = 1568233855 -SHA256 (RPCS3-rpcs3-v0.0.7-8690-g27af75fe7_GH0.tar.gz) = b61ee696f3f555efaee90fef8fe49a1280d146a8029d53b76f848383c39dac50 -SIZE (RPCS3-rpcs3-v0.0.7-8690-g27af75fe7_GH0.tar.gz) = 5573156 +TIMESTAMP = 1568408568 +SHA256 (RPCS3-rpcs3-v0.0.7-8710-gfb8e70d7f_GH0.tar.gz) = 2dbb436a07c7efabae81de76037106b2ba5151afe4e7bc2f2260a15e813a41b2 +SIZE (RPCS3-rpcs3-v0.0.7-8710-gfb8e70d7f_GH0.tar.gz) = 5580036 SHA256 (RPCS3-hidapi-hidapi-0.8.0-rc1-27-g9220f5e_GH0.tar.gz) = 3120e0b701943f452760e45f9fc1ac50bab356ad4c807b4cac4598041c5ca1a5 SIZE (RPCS3-hidapi-hidapi-0.8.0-rc1-27-g9220f5e_GH0.tar.gz) = 105400 SHA256 (RPCS3-llvm-b860b5e8f4ee_GH0.tar.gz) = c151972a0c8ceac568c24b61e63d2ecbdac0f125185e23fc2238e0a14048256e SIZE (RPCS3-llvm-b860b5e8f4ee_GH0.tar.gz) = 47286737 SHA256 (Cyan4973-xxHash-v0.6.5_GH0.tar.gz) = 19030315f4fc1b4b2cdb9d7a317069a109f90e39d1fe4c9159b7aaa39030eb95 SIZE (Cyan4973-xxHash-v0.6.5_GH0.tar.gz) = 37521 SHA256 (jbeder-yaml-cpp-yaml-cpp-0.6.2-23-geca9cfd_GH0.tar.gz) = 554f6fac1d9524f807345f95ba9223332c644e56d7a7fdb2bcea1f5793b764fa SIZE (jbeder-yaml-cpp-yaml-cpp-0.6.2-23-geca9cfd_GH0.tar.gz) = 1397220 SHA256 (kobalicek-asmjit-fc251c9_GH0.tar.gz) = 0fb6271fccf8ee86d27affda7e27a6d655bfabfda83a7dd0d41f7fd05b384aad SIZE (kobalicek-asmjit-fc251c9_GH0.tar.gz) = 446910 SHA256 (KhronosGroup-glslang-7.11.3214_GH0.tar.gz) = b30b4668734328d256e30c94037e60d3775b1055743c04d8fd709f2960f302a9 SIZE (KhronosGroup-glslang-7.11.3214_GH0.tar.gz) = 2841979 SHA256 (Microsoft-GSL-v2.0.0_GH0.tar.gz) = 6cce6fb16b651e62711a4f58e484931013c33979b795d1b1f7646f640cfa9c8e SIZE (Microsoft-GSL-v2.0.0_GH0.tar.gz) = 64726 SHA256 (USCiLab-cereal-v1.2.0_GH0.tar.gz) = 1ccf3ed205a7a2f0d6a060415b123f1ae0d984cd4435db01af8de11a2eda49c1 SIZE (USCiLab-cereal-v1.2.0_GH0.tar.gz) = 299883 SHA256 (zeux-pugixml-v1.9-51-g8bf806c_GH0.tar.gz) = 37bed90f3dadb642acca41508391d1409a75af05f34f13da56c866d5c3c4b00d SIZE (zeux-pugixml-v1.9-51-g8bf806c_GH0.tar.gz) = 560956 Index: head/emulators/rpcs3/files/extra-patch-revert-4504ac2d1248 =================================================================== --- head/emulators/rpcs3/files/extra-patch-revert-4504ac2d1248 (revision 512083) +++ head/emulators/rpcs3/files/extra-patch-revert-4504ac2d1248 (revision 512084) @@ -1,218 +1,218 @@ rpcs3/util/atomic.cpp:95:3: error: use of undeclared identifier 'fallback_wait' fallback_wait(data, size, old_value, timeout); ^ rpcs3/util/atomic.cpp:219:4: error: use of undeclared identifier 'fallback_notify_one' fallback_notify_one(data); ^ rpcs3/util/atomic.cpp:307:5: error: use of undeclared identifier 'fallback_notify_all' fallback_notify_all(data); ^ ---- rpcs3/util/atomic.cpp.orig 2019-09-10 16:25:39 UTC +--- rpcs3/util/atomic.cpp.orig 2019-09-13 21:02:48 UTC +++ rpcs3/util/atomic.cpp -@@ -15,14 +15,11 @@ +@@ -15,14 +15,11 @@ static atomic_t s_hashtable[s_hashtable_size]; // Pointer mask without bits used as hash, assuming signed 48-bit pointers - static constexpr u64 s_pointer_mask = 0xffff'ffff'ffff & ~(s_hashtable_size - 1); + static constexpr u64 s_pointer_mask = 0xffff'ffff'ffff & (~(s_hashtable_size - 1) << 2); -// Max number of waiters is 32767 -static constexpr u64 s_waiter_mask = 0x7fff'0000'0000'0000; -- --// --static constexpr u64 s_collision_bit = 0x8000'0000'0000'0000; +// Max number of waiters is 65535 +static constexpr u64 s_waiter_mask = 0xffff'0000'0000'0000; +-// +-static constexpr u64 s_collision_bit = 0x8000'0000'0000'0000; +- // Implementation detail (remaining bits out of 32 available for futex) -static constexpr u64 s_signal_mask = 0xffffffff & ~(s_waiter_mask | s_pointer_mask | s_collision_bit); +static constexpr u64 s_signal_mask = 0xffffffff & ~(s_waiter_mask | s_pointer_mask); // Callback for wait() function, returns false if wait should return static thread_local bool(*s_tls_wait_cb)(const void* data) = [](const void*) -@@ -182,8 +179,6 @@ +@@ -182,8 +179,6 @@ void atomic_storage_futex::wait(const void* data, std: u32 new_value = 0; - bool fallback = false; - const auto [_, ok] = entry.fetch_op([&](u64& value) { if ((value & s_waiter_mask) == s_waiter_mask || (value & s_signal_mask) == s_signal_mask) -@@ -196,17 +191,11 @@ +@@ -196,17 +191,11 @@ void atomic_storage_futex::wait(const void* data, std: { // Store pointer bits value |= (iptr & s_pointer_mask); - fallback = false; - -#ifdef _WIN32 - value += s_signal_mask & -s_signal_mask; -#endif } else { - // Set collision bit - value |= s_collision_bit; - fallback = true; + // Set pointer bits to all ones (collision, TODO) + value |= s_pointer_mask; } // Add waiter -@@ -220,11 +209,7 @@ +@@ -220,12 +209,8 @@ void atomic_storage_futex::wait(const void* data, std: return; } - if (fallback) -- { -- fallback_wait(data, size, old_value, timeout); -- } -- else if (ptr_cmp(data, size, old_value) && s_tls_wait_cb(data)) -+ if (ptr_cmp(data, size, old_value) && s_tls_wait_cb(data)) ++ if (ptr_cmp(data, size, old_value, mask) && s_tls_wait_cb(data)) { +- fallback_wait(data, size, old_value, timeout, mask); +- } +- else if (ptr_cmp(data, size, old_value, mask) && s_tls_wait_cb(data)) +- { #ifdef _WIN32 LARGE_INTEGER qw; -@@ -260,13 +245,6 @@ + qw.QuadPart = -static_cast(timeout / 100); +@@ -260,13 +245,6 @@ void atomic_storage_futex::wait(const void* data, std: { value -= s_waiter_mask & -s_waiter_mask; -#ifdef _WIN32 - if (!fallback) - { - value -= s_signal_mask & -s_signal_mask; - } -#endif - if ((value & s_waiter_mask) == 0) { // Reset on last waiter -@@ -279,7 +257,7 @@ +@@ -279,7 +257,7 @@ void atomic_storage_futex::wait(const void* data, std: return false; }); - if (ok || fallback) + if (ok) { break; } -@@ -306,20 +284,15 @@ +@@ -306,20 +284,15 @@ void atomic_storage_futex::notify_one(const void* data - atomic_t& entry = s_hashtable[iptr % s_hashtable_size]; + atomic_t& entry = s_hashtable[(iptr >> 2) % s_hashtable_size]; + bool fallback = false; + const auto [prev, ok] = entry.fetch_op([&](u64& value) { if (value & s_waiter_mask && (value & s_pointer_mask) == (iptr & s_pointer_mask)) { #ifdef _WIN32 - if ((value & s_signal_mask) == 0) - { - // No relevant waiters, do nothing - return false; - } - - // Try to decrement if possible + // Try to decrement if no collision value -= s_waiter_mask & -s_waiter_mask; - value -= s_signal_mask & -s_signal_mask; if ((value & s_waiter_mask) == 0) { -@@ -337,22 +310,30 @@ +@@ -337,22 +310,30 @@ void atomic_storage_futex::notify_one(const void* data if ((value & s_signal_mask) == s_signal_mask) { - // Signal will overflow, fallback to notify_all - notify_all(data); + // Signal will overflow, fallback + fallback = true; return false; } #endif + return true; } - else if (value & s_waiter_mask && value & s_collision_bit) + + if (value & s_waiter_mask && (value & s_pointer_mask) == s_pointer_mask) { - fallback_notify_one(data); - return false; + // Collision, notify everything + fallback = true; } return false; }); + if (fallback) + { + notify_all(data); + return; + } + if (ok) { #ifdef _WIN32 -@@ -375,32 +356,11 @@ +@@ -375,32 +356,11 @@ void atomic_storage_futex::notify_all(const void* data { if (value & s_waiter_mask) { - if ((value & s_pointer_mask) == (iptr & s_pointer_mask)) + if ((value & s_pointer_mask) == s_pointer_mask || (value & s_pointer_mask) == (iptr & s_pointer_mask)) { - if ((value & s_signal_mask) == 0) - { - // No relevant waiters, do nothing - return false; - } - - const u64 count = (value & s_signal_mask) / (s_signal_mask & -s_signal_mask); - value -= (s_waiter_mask & -s_waiter_mask) * count; - value -= (s_signal_mask & -s_signal_mask) * count; - - if ((value & s_waiter_mask) == 0) - { - // Reset on last waiter - value = 0; - } - + value = 0; return true; } - - if (value & s_collision_bit) - { - fallback_notify_all(data); - return false; - } } return false; -@@ -411,7 +371,7 @@ +@@ -411,7 +371,7 @@ void atomic_storage_futex::notify_all(const void* data return; } - for (u64 count = old & s_signal_mask; count; count -= s_signal_mask & -s_signal_mask) + for (u64 count = old & s_waiter_mask; count; count -= s_waiter_mask & -s_waiter_mask) { NtReleaseKeyedEvent(nullptr, &entry, false, nullptr); } -@@ -426,17 +386,11 @@ +@@ -426,16 +386,10 @@ void atomic_storage_futex::notify_all(const void* data return false; } - if ((value & s_pointer_mask) == (iptr & s_pointer_mask)) + if ((value & s_pointer_mask) == s_pointer_mask || (value & s_pointer_mask) == (iptr & s_pointer_mask)) { value += s_signal_mask & -s_signal_mask; return true; - } +- } - - if (value & s_collision_bit) - { - fallback_notify_all(data); - return false; -- } + } } - return false; Index: head/emulators/rpcs3/files/extra-patch-revert-5bd17a44c972 =================================================================== --- head/emulators/rpcs3/files/extra-patch-revert-5bd17a44c972 (revision 512083) +++ head/emulators/rpcs3/files/extra-patch-revert-5bd17a44c972 (revision 512084) @@ -1,184 +1,184 @@ rpcs3/util/atomic.cpp:55:51: error: no type named 'node_type' in 'std::__1::multimap, std::__1::allocator > >'; did you mean 'size_type'? thread_local std::multimap::node_type s_tls_waiter = []() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ size_type /usr/include/c++/v1/map:1507:60: note: 'size_type' declared here typedef typename __alloc_traits::size_type size_type; ^ rpcs3/util/atomic.cpp:59:16: error: no member named 'extract' in 'std::__1::multimap, std::__1::allocator > >' return dummy.extract(dummy.emplace(nullptr, &s_tls_waiter)); ~~~~~ ^ rpcs3/util/atomic.cpp:55:61: error: cannot initialize a variable of type 'std::multimap::size_type' (aka 'unsigned long') with an rvalue of type 'void' thread_local std::multimap::node_type s_tls_waiter = []() ^ ~~~~ rpcs3/util/atomic.cpp:92:69: error: no type named 'node_type' in 'std::__1::multimap, std::__1::allocator > >'; did you mean 'size_type'? const auto ptls = static_cast::node_type*>(found->second.tls_ptr); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ size_type /usr/include/c++/v1/map:1507:60: note: 'size_type' declared here typedef typename __alloc_traits::size_type size_type; ^ rpcs3/util/atomic.cpp:93:21: error: no member named 'extract' in 'std::__1::multimap, std::__1::allocator > >' *ptls = wmap.list.extract(found); ~~~~~~~~~ ^ rpcs3/util/atomic.cpp:94:7: error: member reference base type 'unsigned long' is not a structure or union ptls->mapped().cond.notify_one(); ~~~~^ ~~~~~~ ---- rpcs3/util/atomic.cpp.orig 2019-09-10 16:25:39 UTC +--- rpcs3/util/atomic.cpp.orig 2019-09-13 21:02:48 UTC +++ rpcs3/util/atomic.cpp @@ -2,10 +2,6 @@ #include "Utilities/sync.h" -#include -#include -#include - - // Should be at least 65536, currently 2097152. - static constexpr std::uintptr_t s_hashtable_size = 1u << 21; + // Total number of entries, should be a power of 2. + static constexpr std::uintptr_t s_hashtable_size = 1u << 22; @@ -40,134 +36,8 @@ static inline bool ptr_cmp(const void* data, std::size return false; } -// Fallback implementation -namespace -{ - struct waiter - { - std::condition_variable cond; - void* const tls_ptr; - - explicit waiter(void* tls_ptr) - : tls_ptr(tls_ptr) - { - } - }; - - struct waiter_map - { - std::mutex mutex; - std::multimap list; - }; - - // Thread's unique node to insert without allocation - thread_local std::multimap::node_type s_tls_waiter = []() - { - // Initialize node from a dummy container (there is no separate node constructor) - std::multimap dummy; - return dummy.extract(dummy.emplace(nullptr, &s_tls_waiter)); - }(); - - waiter_map& get_fallback_map(const void* ptr) - { - static waiter_map s_waiter_maps[4096]; - - return s_waiter_maps[std::hash()(ptr) % std::size(s_waiter_maps)]; - } - -- void fallback_wait(const void* data, std::size_t size, u64 old_value, u64 timeout) +- void fallback_wait(const void* data, std::size_t size, u64 old_value, u64 timeout, u64 mask) - { - auto& wmap = get_fallback_map(data); - - if (!timeout) - { - return; - } - - // Update node key - s_tls_waiter.key() = data; - -- if (std::unique_lock lock(wmap.mutex); ptr_cmp(data, size, old_value) && s_tls_wait_cb(data)) +- if (std::unique_lock lock(wmap.mutex); ptr_cmp(data, size, old_value, mask) && s_tls_wait_cb(data)) - { - // Add node to the waiter list - const auto iter = wmap.list.insert(std::move(s_tls_waiter)); - - // Wait until the node is returned to its TLS location - if (timeout + 1) - { - if (!iter->second.cond.wait_for(lock, std::chrono::nanoseconds(timeout), [&] - { - return 1 && s_tls_waiter; - })) - { - // Put it back - s_tls_waiter = wmap.list.extract(iter); - } - - return; - } - - while (!s_tls_waiter) - { - iter->second.cond.wait(lock); - } - } - } - - void fallback_notify(waiter_map& wmap, std::multimap::iterator found) - { - // Return notified node to its TLS location - const auto ptls = static_cast::node_type*>(found->second.tls_ptr); - *ptls = wmap.list.extract(found); - ptls->mapped().cond.notify_one(); - } - - void fallback_notify_one(const void* data) - { - auto& wmap = get_fallback_map(data); - - std::lock_guard lock(wmap.mutex); - - if (auto found = wmap.list.find(data); found != wmap.list.end()) - { - fallback_notify(wmap, found); - } - } - - void fallback_notify_all(const void* data) - { - auto& wmap = get_fallback_map(data); - - std::lock_guard lock(wmap.mutex); - - for (auto it = wmap.list.lower_bound(data); it != wmap.list.end() && it->first == data;) - { - fallback_notify(wmap, it++); - } - } -} - -#if !defined(_WIN32) && !defined(__linux__) - - void atomic_storage_futex::wait(const void* data, std::size_t size, u64 old_value, u64 timeout) + void atomic_storage_futex::wait(const void* data, std::size_t size, u64 old_value, u64 timeout, u64 mask) { -- fallback_wait(data, size, old_value, timeout); +- fallback_wait(data, size, old_value, timeout, mask); -} - -void atomic_storage_futex::notify_one(const void* data) -{ - fallback_notify_one(data); -} - -void atomic_storage_futex::notify_all(const void* data) -{ - fallback_notify_all(data); -} - -#else - --void atomic_storage_futex::wait(const void* data, std::size_t size, u64 old_value, u64 timeout) +-void atomic_storage_futex::wait(const void* data, std::size_t size, u64 old_value, u64 timeout, u64 mask) -{ if (!timeout) { return; @@ -402,8 +272,6 @@ void atomic_storage_futex::notify_all(const void* data } #endif } - -#endif void atomic_storage_futex::set_wait_callback(bool(*cb)(const void* data)) {