/// <summary> /// Unregisters a process, indicating that its memory will no longer be used, and that caches can be freed. /// </summary> /// <param name="pid">ID of the process</param> public void UnregisterProcess(long pid) { if (PhysicalMemoryRegistry.TryRemove(pid, out var physicalMemory)) { physicalMemory.ShaderCache.ShaderCacheStateChanged -= ShaderCacheStateUpdate; physicalMemory.Dispose(); } }
/// <summary> /// Creates a new GPU memory manager. /// </summary> /// <param name="pid">ID of the process that owns the memory manager</param> /// <returns>The memory manager</returns> /// <exception cref="ArgumentException">Thrown when <paramref name="pid"/> is invalid</exception> public MemoryManager CreateMemoryManager(long pid) { if (!PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory)) { throw new ArgumentException("The PID is invalid or the process was not registered", nameof(pid)); } return(new MemoryManager(physicalMemory)); }
/// <summary> /// Registers virtual memory used by a process for GPU memory access, caching and read/write tracking. /// </summary> /// <param name="pid">ID of the process that owns <paramref name="cpuMemory"/></param> /// <param name="cpuMemory">Virtual memory owned by the process</param> /// <exception cref="ArgumentException">Thrown if <paramref name="pid"/> was already registered</exception> public void RegisterProcess(long pid, Cpu.IVirtualMemoryManagerTracked cpuMemory) { var physicalMemory = new PhysicalMemory(this, cpuMemory); if (!PhysicalMemoryRegistry.TryAdd(pid, physicalMemory)) { throw new ArgumentException("The PID was already registered", nameof(pid)); } physicalMemory.ShaderCache.ShaderCacheStateChanged += ShaderCacheStateUpdate; }
/// <summary> /// Disposes all GPU resources currently cached. /// It's an error to push any GPU commands after disposal. /// Additionally, the GPU commands FIFO must be empty for disposal, /// and processing of all commands must have finished. /// </summary> public void Dispose() { Renderer.Dispose(); GPFifo.Dispose(); HostInitalized.Dispose(); // Has to be disposed before processing deferred actions, as it will produce some. foreach (var physicalMemory in PhysicalMemoryRegistry.Values) { physicalMemory.Dispose(); } PhysicalMemoryRegistry.Clear(); RunDeferredActions(); }