[Tizen] Change VAO hash value function 72/306672/1
authorEunki Hong <eunkiki.hong@samsung.com>
Wed, 20 Dec 2023 22:56:35 +0000 (07:56 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 26 Feb 2024 03:44:17 +0000 (12:44 +0900)
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>
dali/internal/graphics/gles-impl/gles-context.cpp

index e38c3cd..ef80683 100644 (file)
@@ -60,7 +60,15 @@ struct Context::Impl
     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();