// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #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 void UpdatePageWatchers(VAddr addr, u64 size) const; /// Updates watches in the pages touching the specified region /// using a mask. template 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; }; } // namespace VideoCore