Просмотр исходного кода

command_processor: Use std::array for bound_engines.

subchannel is a 3 bit field. So there must not be more than 8 bound engines.
And using a hashmap for up to 8 values is a bit overpowered.
Markus Wick 7 лет назад
Родитель
Сommit
2081ed7db2
2 измененных файлов с 4 добавлено и 4 удалено
  1. 2 2
      src/video_core/command_processor.cpp
  2. 2 2
      src/video_core/gpu.h

+ 2 - 2
src/video_core/command_processor.cpp

@@ -34,6 +34,8 @@ void GPU::WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params)
               "{:08X} remaining params {}",
               method, subchannel, value, remaining_params);
 
+    ASSERT(subchannel < bound_engines.size());
+
     if (method == static_cast<u32>(BufferMethods::BindObject)) {
         // Bind the current subchannel to the desired engine id.
         LOG_DEBUG(HW_GPU, "Binding subchannel {} to engine {}", subchannel, value);
@@ -47,8 +49,6 @@ void GPU::WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params)
         return;
     }
 
-    ASSERT(bound_engines.find(subchannel) != bound_engines.end());
-
     const EngineID engine = bound_engines[subchannel];
 
     switch (engine) {

+ 2 - 2
src/video_core/gpu.h

@@ -4,8 +4,8 @@
 
 #pragma once
 
+#include <array>
 #include <memory>
-#include <unordered_map>
 #include "common/common_types.h"
 #include "core/hle/service/nvflinger/buffer_queue.h"
 #include "video_core/memory_manager.h"
@@ -136,7 +136,7 @@ private:
     std::unique_ptr<Tegra::MemoryManager> memory_manager;
 
     /// Mapping of command subchannels to their bound engine ids.
-    std::unordered_map<u32, EngineID> bound_engines;
+    std::array<EngineID, 8> bound_engines = {};
 
     /// 3D engine
     std::unique_ptr<Engines::Maxwell3D> maxwell_3d;