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 +#ifdef _MSC_VER +#include +using stdext::hash_map; +#else +#include +using __gnu_cxx::hash_map; +#endif #include #include -#include #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 { + size_t operator()(const VertexLoaderUID& __x) const { + return __x; + } + }; +} +#endif + namespace VertexLoaderManager { -typedef std::map VertexLoaderMap; +typedef hash_map VertexLoaderMap; static VertexLoaderMap g_VertexLoaderMap; // TODO - change into array of pointers. Keep a map of all seen so far.