[GPU]: Try to fix deadlock

This commit is contained in:
Gamer64 2025-07-24 14:46:13 +02:00 committed by crueter
parent 6103d2b7f4
commit eed010964e

View file

@ -116,9 +116,13 @@ struct GPU::Impl {
template <typename Func> template <typename Func>
[[nodiscard]] u64 RequestSyncOperation(Func&& action) { [[nodiscard]] u64 RequestSyncOperation(Func&& action) {
if (fast_path) { if (fast_path) {
// Execute immediately, increment fence, skip queueing // Execute immediately and publish the result
action(); action();
return ++last_sync_fence; const u64 fence = ++last_sync_fence;
// Mirror the normal path: advance current and wake any waiters
current_sync_fence.store(fence, std::memory_order_release);
sync_request_cv.notify_all();
return fence;
} }
std::unique_lock lck{sync_request_mutex}; std::unique_lock lck{sync_request_mutex};
const u64 fence = ++last_sync_fence; const u64 fence = ++last_sync_fence;
@ -132,6 +136,10 @@ struct GPU::Impl {
} }
void WaitForSyncOperation(const u64 fence) { void WaitForSyncOperation(const u64 fence) {
if (fast_path) {
// Dont block when the hack is on
return;
}
std::unique_lock lck{sync_request_mutex}; std::unique_lock lck{sync_request_mutex};
sync_request_cv.wait(lck, [this, fence] { return CurrentSyncRequestFence() >= fence; }); sync_request_cv.wait(lck, [this, fence] { return CurrentSyncRequestFence() >= fence; });
} }
@ -141,9 +149,9 @@ struct GPU::Impl {
if (fast_path) { if (fast_path) {
// Drain queue without waiting on condition variables // Drain queue without waiting on condition variables
while (!sync_requests.empty()) { while (!sync_requests.empty()) {
auto req = std::move(sync_requests.front()); auto request = std::move(sync_requests.front());
sync_requests.pop_front(); sync_requests.pop_front();
req(); request();
current_sync_fence.fetch_add(1, std::memory_order_release); current_sync_fence.fetch_add(1, std::memory_order_release);
} }
return; return;