memory_manager.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <array>
  6. #include <memory>
  7. #include <vector>
  8. #include <boost/optional.hpp>
  9. #include "common/common_types.h"
  10. namespace Tegra {
  11. /// Virtual addresses in the GPU's memory map are 64 bit.
  12. using GPUVAddr = u64;
  13. class MemoryManager final {
  14. public:
  15. MemoryManager() = default;
  16. GPUVAddr AllocateSpace(u64 size, u64 align);
  17. GPUVAddr AllocateSpace(GPUVAddr gpu_addr, u64 size, u64 align);
  18. GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size);
  19. GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size);
  20. boost::optional<VAddr> GpuToCpuAddress(GPUVAddr gpu_addr);
  21. std::vector<GPUVAddr> CpuToGpuAddress(VAddr cpu_addr) const;
  22. static constexpr u64 PAGE_BITS = 16;
  23. static constexpr u64 PAGE_SIZE = 1 << PAGE_BITS;
  24. static constexpr u64 PAGE_MASK = PAGE_SIZE - 1;
  25. private:
  26. boost::optional<GPUVAddr> FindFreeBlock(u64 size, u64 align = 1);
  27. bool IsPageMapped(GPUVAddr gpu_addr);
  28. VAddr& PageSlot(GPUVAddr gpu_addr);
  29. enum class PageStatus : u64 {
  30. Unmapped = 0xFFFFFFFFFFFFFFFFULL,
  31. Allocated = 0xFFFFFFFFFFFFFFFEULL,
  32. };
  33. static constexpr u64 MAX_ADDRESS{0x10000000000ULL};
  34. static constexpr u64 PAGE_TABLE_BITS{10};
  35. static constexpr u64 PAGE_TABLE_SIZE{1 << PAGE_TABLE_BITS};
  36. static constexpr u64 PAGE_TABLE_MASK{PAGE_TABLE_SIZE - 1};
  37. static constexpr u64 PAGE_BLOCK_BITS{14};
  38. static constexpr u64 PAGE_BLOCK_SIZE{1 << PAGE_BLOCK_BITS};
  39. static constexpr u64 PAGE_BLOCK_MASK{PAGE_BLOCK_SIZE - 1};
  40. using PageBlock = std::array<VAddr, PAGE_BLOCK_SIZE>;
  41. std::array<std::unique_ptr<PageBlock>, PAGE_TABLE_SIZE> page_table{};
  42. struct MappedRegion {
  43. VAddr cpu_addr;
  44. GPUVAddr gpu_addr;
  45. u64 size;
  46. };
  47. std::vector<MappedRegion> mapped_regions;
  48. };
  49. } // namespace Tegra