forked from eden-emu/eden
		
	PageTable: move backing addresses to a children class as the CPU page table does not need them.
This PR aims to reduce the memory usage in the CPU page table by moving GPU specific parameters into a child class. This saves 1Gb of Memory for most games.
This commit is contained in:
		
							parent
							
								
									b30b1f741d
								
							
						
					
					
						commit
						27cbb75e7c
					
				
					 3 changed files with 25 additions and 4 deletions
				
			
		|  | @ -16,7 +16,6 @@ void PageTable::Resize(std::size_t address_space_width_in_bits) { | ||||||
| 
 | 
 | ||||||
|     pointers.resize(num_page_table_entries); |     pointers.resize(num_page_table_entries); | ||||||
|     attributes.resize(num_page_table_entries); |     attributes.resize(num_page_table_entries); | ||||||
|     backing_addr.resize(num_page_table_entries); |  | ||||||
| 
 | 
 | ||||||
|     // The default is a 39-bit address space, which causes an initial 1GB allocation size. If the
 |     // The default is a 39-bit address space, which causes an initial 1GB allocation size. If the
 | ||||||
|     // vector size is subsequently decreased (via resize), the vector might not automatically
 |     // 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) { | ||||||
| 
 | 
 | ||||||
|     pointers.shrink_to_fit(); |     pointers.shrink_to_fit(); | ||||||
|     attributes.shrink_to_fit(); |     attributes.shrink_to_fit(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BackingPageTable::BackingPageTable(std::size_t page_size_in_bits) : PageTable{page_size_in_bits} {} | ||||||
|  | 
 | ||||||
|  | BackingPageTable::~BackingPageTable() = default; | ||||||
|  | 
 | ||||||
|  | void BackingPageTable::Resize(std::size_t address_space_width_in_bits) { | ||||||
|  |     PageTable::Resize(address_space_width_in_bits); | ||||||
|  |     const std::size_t num_page_table_entries = 1ULL | ||||||
|  |                                                << (address_space_width_in_bits - page_size_in_bits); | ||||||
|  |     backing_addr.resize(num_page_table_entries); | ||||||
|     backing_addr.shrink_to_fit(); |     backing_addr.shrink_to_fit(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -76,9 +76,20 @@ struct PageTable { | ||||||
|      */ |      */ | ||||||
|     std::vector<PageType> attributes; |     std::vector<PageType> attributes; | ||||||
| 
 | 
 | ||||||
|     std::vector<u64> backing_addr; |  | ||||||
| 
 |  | ||||||
|     const std::size_t page_size_in_bits{}; |     const std::size_t page_size_in_bits{}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * A more advanced Page Table with the ability to save a backing address when using it | ||||||
|  |  * depends on another MMU. | ||||||
|  |  */ | ||||||
|  | struct BackingPageTable : PageTable { | ||||||
|  |     explicit BackingPageTable(std::size_t page_size_in_bits); | ||||||
|  |     ~BackingPageTable(); | ||||||
|  | 
 | ||||||
|  |     void Resize(std::size_t address_space_width_in_bits); | ||||||
|  | 
 | ||||||
|  |     std::vector<u64> backing_addr; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| } // namespace Common
 | } // namespace Common
 | ||||||
|  |  | ||||||
|  | @ -174,7 +174,7 @@ private: | ||||||
|     /// End of address space, based on address space in bits.
 |     /// End of address space, based on address space in bits.
 | ||||||
|     static constexpr GPUVAddr address_space_end{1ULL << address_space_width}; |     static constexpr GPUVAddr address_space_end{1ULL << address_space_width}; | ||||||
| 
 | 
 | ||||||
|     Common::PageTable page_table{page_bits}; |     Common::BackingPageTable page_table{page_bits}; | ||||||
|     VMAMap vma_map; |     VMAMap vma_map; | ||||||
|     VideoCore::RasterizerInterface& rasterizer; |     VideoCore::RasterizerInterface& rasterizer; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Fernando Sahmkow
						Fernando Sahmkow