public IRenderableTexture GetTexture([NotNull] string kn5Filename, string textureName, DeviceContextHolder contextHolder) {
if (kn5Filename == null) throw new ArgumentNullException(nameof(kn5Filename));
var key = kn5Filename + "//" + textureName;
IRenderableTexture texture;
if (_textures.TryGetValue(key, out texture)) return texture;
var result = new RenderableTexture(textureName) { Resource = null };
IOverridedTextureProvider provider;
if (_overridedProviders.TryGetValue(kn5Filename, out provider)) {
LoadOverrideAsync(result, textureName, provider, contextHolder);
}
var kn5 = _kn5Entries.Where(x => string.Equals(x.Filename, kn5Filename, StringComparison.OrdinalIgnoreCase))
.Select(x => x.Kn5).FirstOrDefault(x => x.TexturesData.ContainsKey(textureName));
if (kn5 == null) return result;
result.LoadAsync(kn5.TexturesData[textureName], contextHolder.Device).Forget();
return _textures[key] = result;
}