// In-process, OpenGL-backed implementation of the UIX.RenderApi interfaces. // See logs/MicrosoftIris/RenderApiOpenGL.md for design notes. using System.Collections.Generic; namespace Microsoft.Iris.Render.OpenGL { /// /// Common base for render objects that participate in the reference-counted /// lifetime protocol. The original renderer /// tracks a set of "users" per object; releasing the last user tears the object /// down. We reproduce that behaviour with a simple user set. /// public abstract class SharedRenderObject : ISharedRenderObject { private readonly HashSet m_users = new HashSet(); private bool m_disposed; public int UsageCount => m_users.Count; public void RegisterUsage(object user) { if (user != null) m_users.Add(user); } public void UnregisterUsage(object user) { if (user != null && m_users.Remove(user) && m_users.Count == 0) Dispose(); } protected bool IsDisposed => m_disposed; protected void Dispose() { if (m_disposed) return; m_disposed = true; DisposeCore(); } /// Release any GPU/native resources. Runs at most once. protected virtual void DisposeCore() { } } }