Explorar el Código

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.)
Yuri Kunde Schlesner hace 9 años
padre
commit
f241bb72f5

+ 1 - 1
src/citra_qt/debugger/graphics/graphics_cmdlists.cpp

@@ -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:

+ 8 - 13
src/video_core/regs.cpp

@@ -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) {
-    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 {
     } else {
-        return std::string();
+        // Return empty string if no match is found
+        return "";
     }
     }
 }
 }
 
 

+ 2 - 2
src/video_core/regs.h

@@ -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
-    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");
 static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), "Regs struct has wrong size");