Skip to content

Commit

Permalink
video_core: Use adaptive mutex on Linux
Browse files Browse the repository at this point in the history
Fix performance regression with #1973 on SteamDeck
  • Loading branch information
ngoquang2708 committed Jan 10, 2025
1 parent 562ed2a commit 6180c9a
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/common/adaptive_mutex.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#ifdef __linux__
#include <pthread.h>
#endif

namespace Common {

#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
class AdaptiveMutex {
public:
void lock() {
pthread_mutex_lock(&mutex);
}
void unlock() {
pthread_mutex_unlock(&mutex);
}

private:
pthread_mutex_t mutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP;
};
#endif // PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP

} // namespace Common
7 changes: 7 additions & 0 deletions src/video_core/buffer_cache/word_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
#include <span>
#include <utility>

#ifdef __linux__
#include "common/adaptive_mutex.h"
#endif
#include "common/spin_lock.h"
#include "common/types.h"
#include "video_core/page_manager.h"
Expand Down Expand Up @@ -272,7 +275,11 @@ class RegionManager {
}
}

#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
Common::AdaptiveMutex lock;
#else
Common::SpinLock lock;
#endif
PageManager* tracker;
VAddr cpu_addr = 0;
WordsArray cpu;
Expand Down
7 changes: 7 additions & 0 deletions src/video_core/page_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

#include <memory>
#include <boost/icl/interval_map.hpp>
#ifdef __linux__
#include "common/adaptive_mutex.h"
#endif
#include "common/spin_lock.h"
#include "common/types.h"

Expand Down Expand Up @@ -36,7 +39,11 @@ class PageManager {
std::unique_ptr<Impl> impl;
Vulkan::Rasterizer* rasterizer;
boost::icl::interval_map<VAddr, s32> cached_pages;
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
Common::AdaptiveMutex lock;
#else
Common::SpinLock lock;
#endif
};

} // namespace VideoCore

0 comments on commit 6180c9a

Please sign in to comment.