From ba335126885e9b82a7017ece63f32bc8eb8200c9 Mon Sep 17 00:00:00 2001 From: Eunki Hong Date: Thu, 21 Dec 2023 07:56:35 +0900 Subject: [PATCH] [Tizen] Change VAO hash value function Since std::hash{}(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 --- dali/internal/graphics/gles-impl/gles-context.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dali/internal/graphics/gles-impl/gles-context.cpp b/dali/internal/graphics/gles-impl/gles-context.cpp index e38c3cd..ef80683 100644 --- a/dali/internal/graphics/gles-impl/gles-context.cpp +++ b/dali/internal/graphics/gles-impl/gles-context.cpp @@ -60,7 +60,15 @@ struct Context::Impl std::size_t hash = 0; for(const auto& attr : vertexInputState.attributes) { - hash ^= std::hash{}(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(); -- 2.7.4