mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-03-03 08:10:03 +00:00
[bridge] implement lazy cache lock
This commit is contained in:
parent
0e71ef38d0
commit
72c7940259
@ -45,6 +45,7 @@ enum {
|
||||
kPageWriteWatch = 1 << 0,
|
||||
kPageReadWriteLock = 1 << 1,
|
||||
kPageInvalidated = 1 << 2,
|
||||
kPageLazyLock = 1 << 3
|
||||
};
|
||||
|
||||
static constexpr auto kHostPageSize = 0x1000;
|
||||
@ -71,6 +72,7 @@ struct BridgeHeader {
|
||||
// orbis::shared_mutex cacheCommandMtx;
|
||||
// orbis::shared_cv cacheCommandCv;
|
||||
std::atomic<std::uint64_t> cacheCommands[4];
|
||||
std::atomic<std::uint32_t> gpuCacheCommand;
|
||||
std::atomic<std::uint8_t> cachePages[0x100'0000'0000 / kHostPageSize];
|
||||
|
||||
volatile std::uint64_t pull;
|
||||
|
@ -66,6 +66,18 @@ handle_signal(int sig, siginfo_t *info, void *ucontext) {
|
||||
auto flags = bridge->cachePages[page].load(std::memory_order::relaxed);
|
||||
|
||||
if ((flags & amdgpu::bridge::kPageReadWriteLock) != 0) {
|
||||
if ((flags & amdgpu::bridge::kPageLazyLock) != 0) {
|
||||
if (std::uint32_t gpuCommand = 0;
|
||||
!bridge->gpuCacheCommand.compare_exchange_weak(gpuCommand,
|
||||
page)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
while (!bridge->cachePages[page].compare_exchange_weak(
|
||||
flags, flags & ~amdgpu::bridge::kPageLazyLock,
|
||||
std::memory_order::relaxed)) {
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user