summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/Src/VertexLoader.h25
-rw-r--r--Source/Core/VideoCommon/Src/VertexLoaderManager.cpp21
2 files changed, 43 insertions, 3 deletions
diff --git a/Source/Core/VideoCommon/Src/VertexLoader.h b/Source/Core/VideoCommon/Src/VertexLoader.h
index 3a0f62b1de..8980c4e498 100644
--- a/Source/Core/VideoCommon/Src/VertexLoader.h
+++ b/Source/Core/VideoCommon/Src/VertexLoader.h
@@ -35,6 +35,7 @@
class VertexLoaderUID
{
u32 vid[5];
+ size_t hashValue;
public:
VertexLoaderUID() {}
void InitFromCurrentState(int vtx_attr_group) {
@@ -43,9 +44,31 @@ public:
vid[2] = g_VtxAttr[vtx_attr_group].g0.Hex & ~VAT_0_FRACBITS;
vid[3] = g_VtxAttr[vtx_attr_group].g1.Hex & ~VAT_1_FRACBITS;
vid[4] = g_VtxAttr[vtx_attr_group].g2.Hex & ~VAT_2_FRACBITS;
+ hashValue = hash(*this);
}
bool operator < (const VertexLoaderUID &other) const {
- return std::lexicographical_compare(vid, vid + sizeof(vid) / sizeof(vid[0]), other.vid, other.vid + sizeof(vid) / sizeof(vid[0]));
+ // This is complex because of speed.
+ if (vid[0] < other.vid[0])
+ return true;
+ else if (vid[0] > other.vid[0])
+ return false;
+ for (int i = 1; i < 5; ++i) {
+ if (vid[i] < other.vid[i])
+ return true;
+ else if (vid[i] > other.vid[i])
+ return false;
+ }
+ return false;
+ }
+ static size_t hash(const VertexLoaderUID& rh) {
+ size_t h = -1;
+ for (int i = 0; i < sizeof(rh.vid) / sizeof(rh.vid[0]); ++i) {
+ h = h * 137 + rh.vid[i];
+ }
+ return h;
+ }
+ operator size_t() const {
+ return hashValue;
}
};
diff --git a/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp b/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp
index a7db50e420..cdb4aa42a5 100644
--- a/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp
+++ b/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp
@@ -15,9 +15,16 @@
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
+#include <algorithm>
+#ifdef _MSC_VER
+#include <hash_map>
+using stdext::hash_map;
+#else
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+#endif
#include <map>
#include <vector>
-#include <algorithm>
#include "VideoCommon.h"
#include "Statistics.h"
@@ -30,10 +37,20 @@ static int s_attr_dirty; // bitfield
static VertexLoader *g_VertexLoaders[8];
+#ifndef _MSC_VER
+namespace __gnu_cxx {
+ template<> struct hash<VertexLoaderUID> {
+ size_t operator()(const VertexLoaderUID& __x) const {
+ return __x;
+ }
+ };
+}
+#endif
+
namespace VertexLoaderManager
{
-typedef std::map<VertexLoaderUID, VertexLoader *> VertexLoaderMap;
+typedef hash_map<VertexLoaderUID, VertexLoader*> VertexLoaderMap;
static VertexLoaderMap g_VertexLoaderMap;
// TODO - change into array of pointers. Keep a map of all seen so far.