mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Pica/Regs: Use binary search to look up reg names
This gets rid of the static unordered_map. Also changes the return type const char*, avoiding unnecessary allocations (the result was only used by calling .c_str() on it.)
This commit is contained in:
		
							parent
							
								
									602f57da38
								
							
						
					
					
						commit
						f241bb72f5
					
				
					 3 changed files with 11 additions and 16 deletions
				
			
		|  | @ -72,7 +72,7 @@ QVariant GPUCommandListModel::data(const QModelIndex& index, int role) const { | |||
|     if (role == Qt::DisplayRole) { | ||||
|         switch (index.column()) { | ||||
|         case 0: | ||||
|             return QString::fromLatin1(Pica::Regs::GetCommandName(write.cmd_id).c_str()); | ||||
|             return QString::fromLatin1(Pica::Regs::GetRegisterName(write.cmd_id)); | ||||
|         case 1: | ||||
|             return QString("%1").arg(write.cmd_id, 3, 16, QLatin1Char('0')); | ||||
|         case 2: | ||||
|  |  | |||
|  | @ -2,8 +2,8 @@ | |||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <iterator> | ||||
| #include <unordered_map> | ||||
| #include <utility> | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
|  | @ -474,19 +474,14 @@ static const std::pair<u16, const char*> register_names[] = { | |||
|     {0x2DD, "GPUREG_VSH_OPDESCS_DATA7"}, | ||||
| }; | ||||
| 
 | ||||
| std::string Regs::GetCommandName(int index) { | ||||
|     static std::unordered_map<u32, const char*> map; | ||||
| 
 | ||||
|     if (map.empty()) { | ||||
|         map.insert(std::begin(register_names), std::end(register_names)); | ||||
|     } | ||||
| 
 | ||||
|     // Return empty string if no match is found
 | ||||
|     auto it = map.find(index); | ||||
|     if (it != map.end()) { | ||||
|         return it->second; | ||||
| const char* Regs::GetRegisterName(u16 index) { | ||||
|     auto found = std::lower_bound(std::begin(register_names), std::end(register_names), index, | ||||
|                                   [](auto p, auto i) { return p.first < i; }); | ||||
|     if (found->first == index) { | ||||
|         return found->second; | ||||
|     } else { | ||||
|         return std::string(); | ||||
|         // Return empty string if no match is found
 | ||||
|         return ""; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -64,8 +64,8 @@ struct Regs { | |||
|         std::array<u32, NUM_REGS> reg_array; | ||||
|     }; | ||||
| 
 | ||||
|     // Map register indices to names readable by humans
 | ||||
|     static std::string GetCommandName(int index); | ||||
|     /// Map register indices to names readable by humans
 | ||||
|     static const char* GetRegisterName(u16 index); | ||||
| }; | ||||
| 
 | ||||
| static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), "Regs struct has wrong size"); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue