Since std::hash<uint32_t>{}(i); just return itself,
we need to make some other method to calculate hash of location.
For example, 0 location doesn't have any mean.
and location with 1, 3 will collision as location 2.
To avoid this hash collision, let we change some hash generate method.
v = i + 1;
hash += v << 24;
v *= v;
v ^= i;
hash += v << 16;
v *= v;
hash += v;
Note that if we skip v ^= i; operation, collision occured when location is
near 13.
Change-Id: Ie081d9a5e8895988ca7183dfc860176b69c4e337
Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
std::size_t hash = 0;
for(const auto& attr : vertexInputState.attributes)
{
- hash ^= std::hash<uint32_t>{}(attr.location);
+ // Make unordered hash value by location.
+ // Note : This hash function varified for locations only under < 20.
+ std::size_t salt = attr.location + 1;
+ hash += salt << (sizeof(std::size_t) * 6);
+ salt *= salt;
+ salt ^= attr.location;
+ hash += salt << (sizeof(std::size_t) * 4);
+ salt *= salt;
+ hash += salt;
}
auto& gl = *mController.GetGL();