Loki random generator is not proper-random, if you put in seed gid.x/gid.y. Try to make random noise image with default Loki implementation and you'll see it is not random.
Here is an improved version, which returns proper [0, 1] random numbers.
// seed2 == gid
thread float MetalHelper::random01(const unsigned seed, float2 seed2) {
Loki l = Loki(seed);
// IMPROVEMENT here
float r = fract(sin(dot(float2(seed2.x, seed2.y), float2(12.9898,78.233))) * ((seed2.x + seed2.y) * l.rand()));
return r;
}