mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +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) { |     if (role == Qt::DisplayRole) { | ||||||
|         switch (index.column()) { |         switch (index.column()) { | ||||||
|         case 0: |         case 0: | ||||||
|             return QString::fromLatin1(Pica::Regs::GetCommandName(write.cmd_id).c_str()); |             return QString::fromLatin1(Pica::Regs::GetRegisterName(write.cmd_id)); | ||||||
|         case 1: |         case 1: | ||||||
|             return QString("%1").arg(write.cmd_id, 3, 16, QLatin1Char('0')); |             return QString("%1").arg(write.cmd_id, 3, 16, QLatin1Char('0')); | ||||||
|         case 2: |         case 2: | ||||||
|  |  | ||||||
|  | @ -2,8 +2,8 @@ | ||||||
| // Licensed under GPLv2 or any later version
 | // Licensed under GPLv2 or any later version
 | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
|  | #include <algorithm> | ||||||
| #include <iterator> | #include <iterator> | ||||||
| #include <unordered_map> |  | ||||||
| #include <utility> | #include <utility> | ||||||
| 
 | 
 | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
|  | @ -474,19 +474,14 @@ static const std::pair<u16, const char*> register_names[] = { | ||||||
|     {0x2DD, "GPUREG_VSH_OPDESCS_DATA7"}, |     {0x2DD, "GPUREG_VSH_OPDESCS_DATA7"}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| std::string Regs::GetCommandName(int index) { | const char* Regs::GetRegisterName(u16 index) { | ||||||
|     static std::unordered_map<u32, const char*> map; |     auto found = std::lower_bound(std::begin(register_names), std::end(register_names), index, | ||||||
| 
 |                                   [](auto p, auto i) { return p.first < i; }); | ||||||
|     if (map.empty()) { |     if (found->first == index) { | ||||||
|         map.insert(std::begin(register_names), std::end(register_names)); |         return found->second; | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Return empty string if no match is found
 |  | ||||||
|     auto it = map.find(index); |  | ||||||
|     if (it != map.end()) { |  | ||||||
|         return it->second; |  | ||||||
|     } else { |     } 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; |         std::array<u32, NUM_REGS> reg_array; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     // Map register indices to names readable by humans
 |     /// Map register indices to names readable by humans
 | ||||||
|     static std::string GetCommandName(int index); |     static const char* GetRegisterName(u16 index); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), "Regs struct has wrong size"); | 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