namespace Dashboard.Drawing.OpenGL { public class ContextResourcePoolManager { private readonly Dictionary _unique = new Dictionary(); private readonly Dictionary _shared = new Dictionary(); public ContextResourcePool Get(IGLContext context) { if (context.ContextGroup == -1) { if (!_unique.TryGetValue(context, out ContextResourcePool? pool)) { pool = new ContextResourcePool(this, context); } return pool; } else { if (!_shared.TryGetValue(context.ContextGroup, out ContextResourcePool? pool)) { pool = new ContextResourcePool(this, context.ContextGroup); } return pool; } } internal void Disposed(ContextResourcePool pool) { // TODO: } } public class ContextResourcePool : IGLDisposable, IArc { private int _references = 0; public ContextResourcePoolManager Manager { get; } public IGLContext? Context { get; private set; } = null; public int ContextGroup { get; private set; } = -1; public int References => _references; internal ContextResourcePool(ContextResourcePoolManager manager, int contextGroup) { Manager = manager; ContextGroup = contextGroup; } internal ContextResourcePool(ContextResourcePoolManager manager, IGLContext context) { Manager = manager; Context = context; } ~ContextResourcePool() { Dispose(true, false); } public void Dispose() => Dispose(true, false); public void Dispose(bool safeExit) => Dispose(safeExit, true); private void Dispose(bool safeExit, bool disposing) { Manager.Disposed(this); } public void IncrementReference() { Interlocked.Increment(ref _references); } public bool DecrementReference() { return Interlocked.Decrement(ref _references) == 0; } } }