82 lines
2.3 KiB
C#
82 lines
2.3 KiB
C#
namespace Dashboard.Drawing.OpenGL
|
|
{
|
|
public class ContextResourcePoolManager
|
|
{
|
|
private readonly Dictionary<IGLContext, ContextResourcePool> _unique = new Dictionary<IGLContext, ContextResourcePool>();
|
|
private readonly Dictionary<int, ContextResourcePool> _shared = new Dictionary<int, ContextResourcePool>();
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|