mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-22 10:04:39 +00:00
* Bit array test * Some corrections * Fix AVX path on SetRange * Finish bitArray * Batched protect progress * Inclusion fix * Last logic fixes for BitArray * Page manager: batch protect, masked ranges * Page manager bitarray * clang-format * Fix out of bounds read * clang * clang * Lock during callbacks * Rename untracked to writeable * Construct and mask in one step * Sync on region mutex for thw whole protection This is a temporary workarround until a fix is found for the page manager having issues when multiple threads update the same page at the same time. * Bring back the gpu masking until properly handled * Sync page manager protections * clang-format * Rename and fixups * I fucked up clang-formatting one more time... * kek
56 lines
1.4 KiB
C++
56 lines
1.4 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
#include "common/alignment.h"
|
|
#include "common/types.h"
|
|
#include "video_core/buffer_cache//region_definitions.h"
|
|
|
|
namespace Vulkan {
|
|
class Rasterizer;
|
|
}
|
|
|
|
namespace VideoCore {
|
|
|
|
class PageManager {
|
|
static constexpr size_t PAGE_BITS = 12;
|
|
static constexpr size_t PAGE_SIZE = 1ULL << PAGE_BITS;
|
|
|
|
public:
|
|
explicit PageManager(Vulkan::Rasterizer* rasterizer);
|
|
~PageManager();
|
|
|
|
/// Register a range of mapped gpu memory.
|
|
void OnGpuMap(VAddr address, size_t size);
|
|
|
|
/// Unregister a range of gpu memory that was unmapped.
|
|
void OnGpuUnmap(VAddr address, size_t size);
|
|
|
|
/// Updates watches in the pages touching the specified region.
|
|
template <bool track>
|
|
void UpdatePageWatchers(VAddr addr, u64 size) const;
|
|
|
|
/// Updates watches in the pages touching the specified region
|
|
/// using a mask.
|
|
template <bool track>
|
|
void UpdatePageWatchersForRegion(VAddr base_addr, RegionBits& mask) const;
|
|
|
|
/// Returns page aligned address.
|
|
static constexpr VAddr GetPageAddr(VAddr addr) {
|
|
return Common::AlignDown(addr, PAGE_SIZE);
|
|
}
|
|
|
|
/// Returns address of the next page.
|
|
static constexpr VAddr GetNextPageAddr(VAddr addr) {
|
|
return Common::AlignUp(addr + 1, PAGE_SIZE);
|
|
}
|
|
|
|
private:
|
|
struct Impl;
|
|
std::unique_ptr<Impl> impl;
|
|
};
|
|
|
|
} // namespace VideoCore
|