diff options
| -rw-r--r-- | src/common/page_table.cpp | 12 | ||||
| -rw-r--r-- | src/common/page_table.h | 15 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 2 |
3 files changed, 25 insertions, 4 deletions
diff --git a/src/common/page_table.cpp b/src/common/page_table.cpp index 69b7abc54..566b57b62 100644 --- a/src/common/page_table.cpp +++ b/src/common/page_table.cpp | |||
| @@ -16,7 +16,6 @@ void PageTable::Resize(std::size_t address_space_width_in_bits) { | |||
| 16 | 16 | ||
| 17 | pointers.resize(num_page_table_entries); | 17 | pointers.resize(num_page_table_entries); |
| 18 | attributes.resize(num_page_table_entries); | 18 | attributes.resize(num_page_table_entries); |
| 19 | backing_addr.resize(num_page_table_entries); | ||
| 20 | 19 | ||
| 21 | // The default is a 39-bit address space, which causes an initial 1GB allocation size. If the | 20 | // The default is a 39-bit address space, which causes an initial 1GB allocation size. If the |
| 22 | // vector size is subsequently decreased (via resize), the vector might not automatically | 21 | // vector size is subsequently decreased (via resize), the vector might not automatically |
| @@ -25,6 +24,17 @@ void PageTable::Resize(std::size_t address_space_width_in_bits) { | |||
| 25 | 24 | ||
| 26 | pointers.shrink_to_fit(); | 25 | pointers.shrink_to_fit(); |
| 27 | attributes.shrink_to_fit(); | 26 | attributes.shrink_to_fit(); |
| 27 | } | ||
| 28 | |||
| 29 | BackingPageTable::BackingPageTable(std::size_t page_size_in_bits) : PageTable{page_size_in_bits} {} | ||
| 30 | |||
| 31 | BackingPageTable::~BackingPageTable() = default; | ||
| 32 | |||
| 33 | void BackingPageTable::Resize(std::size_t address_space_width_in_bits) { | ||
| 34 | PageTable::Resize(address_space_width_in_bits); | ||
| 35 | const std::size_t num_page_table_entries = 1ULL | ||
| 36 | << (address_space_width_in_bits - page_size_in_bits); | ||
| 37 | backing_addr.resize(num_page_table_entries); | ||
| 28 | backing_addr.shrink_to_fit(); | 38 | backing_addr.shrink_to_fit(); |
| 29 | } | 39 | } |
| 30 | 40 | ||
diff --git a/src/common/page_table.h b/src/common/page_table.h index 8b8ff0bb8..dbc272ab7 100644 --- a/src/common/page_table.h +++ b/src/common/page_table.h | |||
| @@ -76,9 +76,20 @@ struct PageTable { | |||
| 76 | */ | 76 | */ |
| 77 | std::vector<PageType> attributes; | 77 | std::vector<PageType> attributes; |
| 78 | 78 | ||
| 79 | std::vector<u64> backing_addr; | ||
| 80 | |||
| 81 | const std::size_t page_size_in_bits{}; | 79 | const std::size_t page_size_in_bits{}; |
| 82 | }; | 80 | }; |
| 83 | 81 | ||
| 82 | /** | ||
| 83 | * A more advanced Page Table with the ability to save a backing address when using it | ||
| 84 | * depends on another MMU. | ||
| 85 | */ | ||
| 86 | struct BackingPageTable : PageTable { | ||
| 87 | explicit BackingPageTable(std::size_t page_size_in_bits); | ||
| 88 | ~BackingPageTable(); | ||
| 89 | |||
| 90 | void Resize(std::size_t address_space_width_in_bits); | ||
| 91 | |||
| 92 | std::vector<u64> backing_addr; | ||
| 93 | }; | ||
| 94 | |||
| 84 | } // namespace Common | 95 | } // namespace Common |
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index aea010087..073bdb491 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h | |||
| @@ -174,7 +174,7 @@ private: | |||
| 174 | /// End of address space, based on address space in bits. | 174 | /// End of address space, based on address space in bits. |
| 175 | static constexpr GPUVAddr address_space_end{1ULL << address_space_width}; | 175 | static constexpr GPUVAddr address_space_end{1ULL << address_space_width}; |
| 176 | 176 | ||
| 177 | Common::PageTable page_table{page_bits}; | 177 | Common::BackingPageTable page_table{page_bits}; |
| 178 | VMAMap vma_map; | 178 | VMAMap vma_map; |
| 179 | VideoCore::RasterizerInterface& rasterizer; | 179 | VideoCore::RasterizerInterface& rasterizer; |
| 180 | 180 | ||