one Time Cache Setup
Generates the shared textureUnits GL texture names once per EGL context. Safe to call repeatedly: a no-op if hasInitialized is already true for the current context, but detects an EGL context switch (e.g. a second MapView/activity) via object identity against textureContext and regenerates + resets the shared bind bookkeeping in that case, since texture names from the old context are meaningless (or worse, colliding) in the new one.