Exemplo n.º 1
0
        /// <inheritdoc/>
        protected override void PrepareContext()
        {
            base.PrepareContext();

            // Init assets
            if (Context.InitializeDatabase)
            {
                databaseFileProvider = InitializeAssetDatabase();
                ((DatabaseFileProviderService)Services.GetService <IDatabaseFileProviderService>()).FileProvider = databaseFileProvider;

                var renderingSettings = new RenderingSettings();
                if (Content.Exists(GameSettings.AssetUrl))
                {
                    Settings = Content.Load <GameSettings>(GameSettings.AssetUrl);

                    renderingSettings = Settings.Configurations.Get <RenderingSettings>();

                    // Set ShaderProfile even if AutoLoadDefaultSettings is false (because that is what shaders in effect logs are compiled against, even if actual instantiated profile is different)
                    if (renderingSettings.DefaultGraphicsProfile > 0)
                    {
                        var deviceManager = (GraphicsDeviceManager)graphicsDeviceManager;
                        if (!deviceManager.ShaderProfile.HasValue)
                        {
                            deviceManager.ShaderProfile = renderingSettings.DefaultGraphicsProfile;
                        }
                    }
                }

                // Load several default settings
                if (AutoLoadDefaultSettings)
                {
                    var deviceManager = (GraphicsDeviceManager)graphicsDeviceManager;
                    if (renderingSettings.DefaultGraphicsProfile > 0)
                    {
                        deviceManager.PreferredGraphicsProfile = new[] { renderingSettings.DefaultGraphicsProfile };
                    }

                    if (renderingSettings.DefaultBackBufferWidth > 0)
                    {
                        deviceManager.PreferredBackBufferWidth = renderingSettings.DefaultBackBufferWidth;
                    }
                    if (renderingSettings.DefaultBackBufferHeight > 0)
                    {
                        deviceManager.PreferredBackBufferHeight = renderingSettings.DefaultBackBufferHeight;
                    }

                    deviceManager.PreferredColorSpace        = renderingSettings.ColorSpace;
                    SceneSystem.InitialSceneUrl              = Settings?.DefaultSceneUrl;
                    SceneSystem.InitialGraphicsCompositorUrl = Settings?.DefaultGraphicsCompositorUrl;
                    SceneSystem.SplashScreenUrl              = Settings?.SplashScreenUrl;
                    SceneSystem.SplashScreenColor            = Settings?.SplashScreenColor ?? Color4.Black;
                    SceneSystem.DoubleViewSplashScreen       = Settings?.DoubleViewSplashScreen ?? false;
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Loads chunk data from the storage container.
        /// </summary>
        /// <param name="fileProvider">Database file provider.</param>
        public unsafe IntPtr GetData(DatabaseFileProvider fileProvider)
        {
            if (IsLoaded)
            {
                return(data);
            }

            if (fileProvider == null)
            {
                throw new ContentStreamingException("Missing file provider.", Storage);
            }

            using (var stream = fileProvider.OpenStream(Storage.Url, VirtualFileMode.Open, VirtualFileAccess.Read, VirtualFileShare.Read, StreamFlags.Seekable))
            {
                stream.Position = Location;

#if USE_UNMANAGED
                var chunkBytes = Utilities.AllocateMemory(Size);

                int bufferCapacity = Math.Min(8192, Size);
                var buffer         = new byte[bufferCapacity];

                int count = Size;
                fixed(byte *bufferFixed = buffer)
                {
                    var chunkBytesPtr = chunkBytes;
                    var bufferPtr     = new IntPtr(bufferFixed);

                    do
                    {
                        int read = stream.Read(buffer, 0, Math.Min(count, bufferCapacity));
                        if (read <= 0)
                        {
                            break;
                        }
                        Utilities.CopyMemory(chunkBytesPtr, bufferPtr, read);
                        chunkBytesPtr += read;
                        count         -= read;
                    } while (count > 0);
                }
#else
                var bytes = new byte[Size];
                stream.Read(bytes, 0, Size);

                handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
                var chunkBytes = handle.AddrOfPinnedObject();
#endif

                data = chunkBytes;
            }

            RegisterUsage();

            return(data);
        }
Exemplo n.º 3
0
        public void Init()
        {
            // Create and mount database file system
            var objDatabase          = ObjectDatabase.CreateDefaultDatabase();
            var databaseFileProvider = new DatabaseFileProvider(objDatabase);

            AssetManager.GetFileProvider = () => databaseFileProvider;

            shaderMixinParser = new ShaderMixinParser(AssetManager.FileProvider);
            shaderMixinParser.SourceManager.LookupDirectoryList.Add("/shaders");
        }
Exemplo n.º 4
0
        private static void Main5()
        {
            // Create and mount database file system
            var objDatabase          = ObjectDatabase.CreateDefaultDatabase();
            var assetIndexMap        = ContentIndexMap.Load(VirtualFileSystem.ApplicationDatabaseIndexPath);
            var databaseFileProvider = new DatabaseFileProvider(assetIndexMap, objDatabase);

            var test = new TestGenericClass();

            test.Run();
        }
Exemplo n.º 5
0
        private void Init()
        {
            // Create and mount database file system
            var objDatabase          = ObjectDatabase.CreateDefaultDatabase();
            var databaseFileProvider = new DatabaseFileProvider(objDatabase);

            manager = new ShaderSourceManager(databaseFileProvider);
            manager.LookupDirectoryList.Add("shaders");
            logger = new Stride.Core.Shaders.Utility.LoggerResult();
            loader = new ShaderLoader(manager);
        }
Exemplo n.º 6
0
        internal static DatabaseFileProvider InitializeAssetDatabase()
        {
            // Create and mount database file system
            var objDatabase = ObjectDatabase.CreateDefaultDatabase();

            // Only set a mount path if not mounted already
            var mountPath = VirtualFileSystem.ResolveProviderUnsafe("/asset", true).Provider == null ? "/asset" : null;
            var result    = new DatabaseFileProvider(objDatabase, mountPath);

            return(result);
        }
Exemplo n.º 7
0
        public void Init()
        {
            // Create and mount database file system
            var objDatabase          = new ObjectDatabase("/data/db", "index", "/local/db");
            var databaseFileProvider = new DatabaseFileProvider(objDatabase);

            AssetManager.GetFileProvider = () => databaseFileProvider;

            shaderMixinParser = new ShaderMixinParser();
            shaderMixinParser.SourceManager.LookupDirectoryList.Add("/shaders");
        }
Exemplo n.º 8
0
        /// <summary>
        /// Initializes the asset database. Similar to <see cref="Game.InitializeAssetDatabase"/>, but accessible without using internals.
        /// </summary>
        private static void InitializeAssetDatabase()
        {
            // Create and mount database file system
            var objDatabase = new ObjectDatabase("/data/db", "index", "/local/db");

            // Only set a mount path if not mounted already
            var mountPath            = VirtualFileSystem.ResolveProviderUnsafe("/asset", true).Provider == null ? "/asset" : null;
            var databaseFileProvider = new DatabaseFileProvider(objDatabase, mountPath);

            AssetManager.GetFileProvider = () => databaseFileProvider;
        }
Exemplo n.º 9
0
 private void DestroyAssetDatabase()
 {
     if (databaseFileProvider != null)
     {
         if (Services.GetService <IDatabaseFileProviderService>() is DatabaseFileProviderService dbfp)
         {
             dbfp.FileProvider = null;
         }
         databaseFileProvider.Dispose();
         databaseFileProvider = null;
     }
 }
Exemplo n.º 10
0
        private void CopyStream(DatabaseFileProvider database, string fromFilePath)
        {
            var shaderFilename = string.Format("shaders/{0}", Path.GetFileName(fromFilePath));

            using (var outStream = database.OpenStream(shaderFilename, VirtualFileMode.Create, VirtualFileAccess.Write, VirtualFileShare.Write))
            {
                using (var inStream = new FileStream(fromFilePath, FileMode.Open, FileAccess.Read))
                {
                    inStream.CopyTo(outStream);
                }
            }
        }
Exemplo n.º 11
0
        public void Init()
        {
            // Create and mount database file system
            var objDatabase          = ObjectDatabase.CreateDefaultDatabase();
            var databaseFileProvider = new DatabaseFileProvider(objDatabase);

            ContentManager.GetFileProvider = () => databaseFileProvider;

            sourceManager = new ShaderSourceManager();
            sourceManager.LookupDirectoryList.Add(@"shaders");
            shaderLoader = new ShaderLoader(sourceManager);
        }
Exemplo n.º 12
0
 /// <summary>
 /// Create a new thumbnail request from entity.
 /// </summary>
 /// <param name="thumbnailUrl">The Url of the thumbnail</param>
 /// <param name="scene">The scene describing the thumbnail to draw</param>
 /// <param name="provider">The provider to use for the request.</param>
 /// <param name="thumbnailSize">The desired size of the thumbnail</param>
 /// <param name="colorSpace">The color space.</param>
 /// <param name="renderingMode">the rendering mode (hdr or ldr).</param>
 /// <param name="logger">The logger</param>
 /// <param name="logLevel">The dependency build status log level</param>
 public ThumbnailBuildRequest(string thumbnailUrl, Scene scene, GraphicsCompositor graphicsCompositor, DatabaseFileProvider provider, Int2 thumbnailSize, ColorSpace colorSpace, RenderingMode renderingMode, ILogger logger, LogMessageType logLevel)
 {
     Logger                = logger;
     Url                   = thumbnailUrl;
     Size                  = thumbnailSize;
     Scene                 = scene;
     GraphicsCompositor    = graphicsCompositor;
     FileProvider          = provider;
     DependencyBuildStatus = logLevel;
     ColorSpace            = colorSpace;
     RenderingMode         = renderingMode;
 }
Exemplo n.º 13
0
        public void Init()
        {
            // Create and mount database file system
            var objDatabase          = ObjectDatabase.CreateDefaultDatabase();
            var databaseFileProvider = new DatabaseFileProvider(objDatabase);

            ContentManager.GetFileProvider = () => databaseFileProvider;

            manager = new ShaderSourceManager();
            manager.LookupDirectoryList.Add("shaders");
            logger = new SiliconStudio.Shaders.Utility.LoggerResult();
            loader = new ShaderLoader(manager);
        }
Exemplo n.º 14
0
        private void Init()
        {
            // Create and mount database file system
            var objDatabase          = ObjectDatabase.CreateDefaultDatabase();
            var databaseFileProvider = new DatabaseFileProvider(objDatabase);

            Compiler = new EffectCompiler(databaseFileProvider);
            Compiler.SourceDirectories.Add("shaders");
            MixinParameters = new CompilerParameters();
            MixinParameters.EffectParameters.Platform = GraphicsPlatform.Direct3D11;
            MixinParameters.EffectParameters.Profile  = GraphicsProfile.Level_11_0;
            ResultLogger = new LoggerResult();
        }
Exemplo n.º 15
0
        public static void Main5()
        {
            // Create and mount database file system
            var objDatabase          = new ObjectDatabase("/data/db");
            var assetIndexMap        = AssetIndexMap.Load();
            var databaseFileProvider = new DatabaseFileProvider(assetIndexMap, objDatabase);

            AssetManager.GetFileProvider = () => databaseFileProvider;

            var test = new TestGenericClass();

            test.Run();
        }
Exemplo n.º 16
0
        public void Init()
        {
            // Create and mount database file system
            var objDatabase          = new ObjectDatabase("/data/db", "index", "/local/db");
            var databaseFileProvider = new DatabaseFileProvider(objDatabase);

            AssetManager.GetFileProvider = () => databaseFileProvider;

            manager = new ShaderSourceManager();
            manager.LookupDirectoryList.Add("shaders");
            logger = new SiliconStudio.Shaders.Utility.LoggerResult();
            loader = new ShaderLoader(manager);
        }
Exemplo n.º 17
0
        internal static void InitializeAssetDatabase()
        {
            using (Profiler.Begin(GameProfilingKeys.ObjectDatabaseInitialize))
            {
                // Create and mount database file system
                var objDatabase = ObjectDatabase.CreateDefaultDatabase();

                // Only set a mount path if not mounted already
                var mountPath            = VirtualFileSystem.ResolveProviderUnsafe("/asset", true).Provider == null ? "/asset" : null;
                var databaseFileProvider = new DatabaseFileProvider(objDatabase, mountPath);

                ContentManager.GetFileProvider = () => databaseFileProvider;
            }
        }
Exemplo n.º 18
0
        public void Init()
        {
            using (var profile = Profiler.Begin(GameProfilingKeys.ObjectDatabaseInitialize))
            {
                // Create and mount database file system
                var objDatabase          = new ObjectDatabase("/data/db", "index", "/local/db");
                var databaseFileProvider = new DatabaseFileProvider(objDatabase);
                AssetManager.GetFileProvider = () => databaseFileProvider;
            }

            sourceManager = new ShaderSourceManager();
            sourceManager.LookupDirectoryList.Add(@"shaders");
            shaderLoader = new ShaderLoader(sourceManager);
        }
Exemplo n.º 19
0
        public void Init()
        {
            // Create and mount database file system
            var objDatabase          = new ObjectDatabase("/data/db", "index", "/local/db");
            var databaseFileProvider = new DatabaseFileProvider(objDatabase);

            AssetManager.GetFileProvider = () => databaseFileProvider;

            Compiler = new EffectCompiler();
            Compiler.SourceDirectories.Add("shaders");
            MixinParameters = new ShaderMixinParameters();
            MixinParameters.Add(CompilerParameters.GraphicsPlatformKey, GraphicsPlatform.Direct3D11);
            MixinParameters.Add(CompilerParameters.GraphicsProfileKey, GraphicsProfile.Level_11_0);
            ResultLogger = new LoggerResult();
        }
Exemplo n.º 20
0
        public static void Main()
        {
            using (var profile = Profiler.Begin(GameProfilingKeys.ObjectDatabaseInitialize))
            {
                // Create and mount database file system
                var objDatabase          = new ObjectDatabase("/data/db");
                var assetIndexMap        = AssetIndexMap.Load();
                var databaseFileProvider = new DatabaseFileProvider(assetIndexMap, objDatabase);
                AssetManager.GetFileProvider = () => databaseFileProvider;
            }

            var test = new TestGenericClass();

            test.Run();
        }
Exemplo n.º 21
0
        private void PrepareContext()
        {
            // Content manager (this will be shared to all the EngineCores)
            Content = new ContentManager(_services);
            _services.AddService <IContentManager>(Content);
            _services.AddService(Content);

            // Initialize assets
            if (_initializeDatabase)
            {
                _databaseFileProvider = InitializeAssetDatabase();
                ((DatabaseFileProviderService)_services.GetService <IDatabaseFileProviderService>()).FileProvider = _databaseFileProvider;

                if (Content.Exists(GameSettings.AssetUrl))  // TODO: maybe server needs its own GameSettings asset url?
                {
                    Settings = Content.Load <GameSettings>(GameSettings.AssetUrl);
                }
                else
                {
                    Settings = new GameSettings
                    {
                        Configurations = new PlatformConfigurations(),
                    };
                    //var navSettings = Settings.Configurations.Get<NavigationSettings>();
                    //if (navSettings == null)
                    //{
                    //    var navConfigSettings = new ConfigurationOverride
                    //    {
                    //        Configuration = navSettings
                    //    };
                    //    Settings.Configurations.Configurations.Add(navConfigSettings);
                    //}
                }
                _services.AddService <IGameSettingsService>(this);
            }
            // HACK (kind of): Server must run at a fixed rate, which we'll manually control with _physicGameTime
            var physicsSettings = Settings.Configurations.Get <PhysicsSettings>() ?? new PhysicsSettings();

            physicsSettings.Flags         = PhysicsEngineFlags.ContinuousCollisionDetection;
            physicsSettings.MaxSubSteps   = 0;  // Important to keep this at 0 since this makes BulletPhysics simulate exactly one step per update
            physicsSettings.FixedTimeStep = (float)GameConfig.PhysicsFixedTimeStep.TotalSeconds;
            var physicsConfigSettings = new ConfigurationOverride
            {
                Configuration = physicsSettings
            };

            Settings.Configurations.Configurations.Add(physicsConfigSettings);
        }
Exemplo n.º 22
0
        public static void Main()
        {
            using (var profile = Profiler.Begin(GameProfilingKeys.ObjectDatabaseInitialize))
            {
                // Create and mount database file system
                var objDatabase          = new ObjectDatabase("/data/db");
                var assetIndexMap        = AssetIndexMap.Load();
                var databaseFileProvider = new DatabaseFileProvider(assetIndexMap, objDatabase);
                AssetManager.GetFileProvider = () => databaseFileProvider;
            }

            compiler = new EffectCompiler();
            compiler.SourceDirectories.Add("shaders");
            var shaderMixinSource = new ShaderMixinSource();

            shaderMixinSource.Mixins.Add(new ShaderClassSource("ShaderBase"));
            shaderMixinSource.Mixins.Add(new ShaderClassSource("TransformationWVP"));
            shaderMixinSource.Mixins.Add(new ShaderClassSource("ShadingBase"));

            var shaderMixinSource2 = new ShaderMixinSource();

            shaderMixinSource2.Mixins.Add(new ShaderClassSource("ShaderBase"));
            shaderMixinSource2.Mixins.Add(new ShaderClassSource("TransformationWVP"));
            shaderMixinSource2.Mixins.Add(new ShaderClassSource("ShadingBase"));
            shaderMixinSource2.Mixins.Add(new ShaderClassSource("ShadingOverlay"));

            var allThreads = new List <Thread>();

            for (int i = 0; i < NumThreads; ++i)
            {
                CompilerThread compilerThread;
                if (i % 2 == 0)
                {
                    compilerThread = new CompilerThread(compiler, shaderMixinSource);
                }
                else
                {
                    compilerThread = new CompilerThread(compiler, shaderMixinSource2);
                }
                allThreads.Add(new Thread(compilerThread.Compile));
            }

            foreach (var thread in allThreads)
            {
                thread.Start();
            }
        }
Exemplo n.º 23
0
        public void Init()
        {
            using (var profile = Profiler.Begin(GameProfilingKeys.ObjectDatabaseInitialize))
            {
                // Create and mount database file system
                var objDatabase          = new ObjectDatabase("/data/db", "index", "/local/db");
                var databaseFileProvider = new DatabaseFileProvider(objDatabase);
                AssetManager.GetFileProvider = () => databaseFileProvider;
            }

            shaderMixinParser = new ShaderMixinParser();
            var sources = new List <string> {
                "shaders"
            };

            shaderMixinParser.SourceManager.LookupDirectoryList = sources;
        }
        public static void Main3()
        {
            // Create and mount database file system
            var objDatabase          = ObjectDatabase.CreateDefaultDatabase();
            var assetIndexMap        = ContentIndexMap.Load(VirtualFileSystem.ApplicationDatabaseIndexPath);
            var databaseFileProvider = new DatabaseFileProvider(assetIndexMap, objDatabase);

            ContentManager.GetFileProvider = () => databaseFileProvider;

            compiler = new EffectCompiler();
            compiler.SourceDirectories.Add("shaders");
            var shaderMixinSource = new ShaderMixinSource();

            shaderMixinSource.Mixins.Add(new ShaderClassSource("ShaderBase"));
            shaderMixinSource.Mixins.Add(new ShaderClassSource("TransformationWVP"));
            shaderMixinSource.Mixins.Add(new ShaderClassSource("ShadingBase"));

            var shaderMixinSource2 = new ShaderMixinSource();

            shaderMixinSource2.Mixins.Add(new ShaderClassSource("ShaderBase"));
            shaderMixinSource2.Mixins.Add(new ShaderClassSource("TransformationWVP"));
            shaderMixinSource2.Mixins.Add(new ShaderClassSource("ShadingBase"));
            shaderMixinSource2.Mixins.Add(new ShaderClassSource("ShadingOverlay"));

            var allThreads = new List <Thread>();

            for (int i = 0; i < NumThreads; ++i)
            {
                CompilerThread compilerThread;
                if (i % 2 == 0)
                {
                    compilerThread = new CompilerThread(compiler, shaderMixinSource);
                }
                else
                {
                    compilerThread = new CompilerThread(compiler, shaderMixinSource2);
                }
                allThreads.Add(new Thread(compilerThread.Compile));
            }

            foreach (var thread in allThreads)
            {
                thread.Start();
            }
        }
Exemplo n.º 25
0
        private void CollectReferences(DatabaseFileProvider databaseFileProvider, Bundle bundle, HashSet <string> assets, string assetUrl)
        {
            // Already included?
            if (!assets.Add(assetUrl))
            {
                return;
            }

            if (!databaseFileProvider.ContentIndexMap.TryGetValue(assetUrl, out ObjectId objectId))
            {
                throw new InvalidOperationException($"Could not find Asset {assetUrl} for bundle {bundle.Name}.");
            }

            // Include references
            foreach (var reference in GetChunkReferences(databaseFileProvider, ref objectId))
            {
                CollectReferences(databaseFileProvider, bundle, assets, reference);
            }
        }
Exemplo n.º 26
0
        /// <summary>
        /// Gets and cache the asset url referenced by the chunk with the given identifier.
        /// </summary>
        /// <param name="objectId">The object identifier.</param>
        /// <returns>The list of asset url referenced.</returns>
        private List <string> GetChunkReferences(DatabaseFileProvider databaseFileProvider, ref ObjectId objectId)
        {
            List <string> references;

            // Check the cache
            if (!referencesByObjectId.TryGetValue(objectId, out references))
            {
                // First time, need to scan it
                referencesByObjectId[objectId] = references = new List <string>();

                // Open stream to read list of chunk references
                using (var stream = databaseFileProvider.OpenStream(DatabaseFileProvider.ObjectIdUrl + objectId, VirtualFileMode.Open, VirtualFileAccess.Read))
                {
                    // Read chunk header
                    var streamReader = new BinarySerializationReader(stream);
                    var header       = ChunkHeader.Read(streamReader);

                    // Only process chunks
                    if (header != null)
                    {
                        if (header.OffsetToReferences != -1)
                        {
                            // Seek to where references are stored and deserialize them
                            streamReader.NativeStream.Seek(header.OffsetToReferences, SeekOrigin.Begin);

                            List <ChunkReference> chunkReferences = null;
                            streamReader.Serialize(ref chunkReferences, ArchiveMode.Deserialize);

                            foreach (var chunkReference in chunkReferences)
                            {
                                references.Add(chunkReference.Location);
                            }
                        }
                    }
                }
            }

            return(references);
        }
Exemplo n.º 27
0
        private static void Collect(HashSet <ObjectId> objectIds, ObjectId objectId, IAssetIndexMap assetIndexMap)
        {
            // Already added?
            if (!objectIds.Add(objectId))
            {
                return;
            }

            using (var stream = AssetManager.FileProvider.OpenStream(DatabaseFileProvider.ObjectIdUrl + objectId, VirtualFileMode.Open, VirtualFileAccess.Read))
            {
                // Read chunk header
                var streamReader = new BinarySerializationReader(stream);
                var header       = ChunkHeader.Read(streamReader);

                // Only process chunks
                if (header != null)
                {
                    if (header.OffsetToReferences != -1)
                    {
                        // Seek to where references are stored and deserialize them
                        streamReader.NativeStream.Seek(header.OffsetToReferences, SeekOrigin.Begin);

                        List <ChunkReference> references = null;
                        streamReader.Serialize(ref references, ArchiveMode.Deserialize);

                        foreach (var reference in references)
                        {
                            ObjectId refObjectId;
                            var      databaseFileProvider = DatabaseFileProvider.ResolveObjectId(reference.Location, out refObjectId);
                            if (databaseFileProvider != null)
                            {
                                Collect(objectIds, refObjectId, databaseFileProvider.AssetIndexMap);
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 28
0
 public DatabaseFileProviderService(DatabaseFileProvider fileProvider)
 {
     FileProvider = fileProvider;
 }
Exemplo n.º 29
0
 public RemoteEffectCompiler(IVirtualFileProvider fileProvider, DatabaseFileProvider database, RemoteEffectCompilerClient remoteEffectCompilerClient)
 {
     FileProvider  = fileProvider;
     this.database = database;
     this.remoteEffectCompilerClient = remoteEffectCompilerClient;
 }
Exemplo n.º 30
0
        private KeyValuePair <EffectBytecode, EffectBytecodeCacheLoadSource> LoadEffectBytecode(DatabaseFileProvider database, ObjectId bytecodeId)
        {
            KeyValuePair <EffectBytecode, EffectBytecodeCacheLoadSource> bytecodePair;

            if (!bytecodes.TryGetValue(bytecodeId, out bytecodePair))
            {
                if (!bytecodesByPassingStorage.Contains(bytecodeId) && database.ObjectDatabase.Exists(bytecodeId))
                {
                    using (var stream = database.ObjectDatabase.OpenStream(bytecodeId))
                    {
                        var bytecode = EffectBytecode.FromStream(stream);

                        // Try to read an integer that would specify what kind of cache it belongs to (if undefined because of old versions, mark it as dynamic cache)
                        var cacheSource = EffectBytecodeCacheLoadSource.DynamicCache;
                        if (stream.Position < stream.Length)
                        {
                            var binaryReader = new BinarySerializationReader(stream);
                            cacheSource = (EffectBytecodeCacheLoadSource)binaryReader.ReadInt32();
                        }
                        bytecodePair = new KeyValuePair <EffectBytecode, EffectBytecodeCacheLoadSource>(bytecode, cacheSource);
                    }
                }
                if (bytecodePair.Key != null)
                {
                    bytecodes.Add(bytecodeId, bytecodePair);
                }
            }

            // Always check that the bytecode is in sync with hash sources on all platforms
            if (bytecodePair.Key != null && IsBytecodeObsolete(bytecodePair.Key))
            {
                bytecodes.Remove(bytecodeId);
                bytecodePair = new KeyValuePair <EffectBytecode, EffectBytecodeCacheLoadSource>(null, EffectBytecodeCacheLoadSource.JustCompiled);
            }

            return(bytecodePair);
        }