public static UniqueRender Store(int[] data, RenderTarget2D target, RenderTarget2D depth) { long hash = GetHash(data); UniqueRenderPair urp; if (m_RenderPairs.Keys.Contains(hash) && m_RenderPairs[hash] == null /* is waiting */) { // Remove before new store. FilteredConsole.WriteLine(FilterCategory.UniqueRendering, "Releasing waiting result."); m_RenderPairs.Remove(hash); } if (m_RenderPairs.Keys.Contains(hash)) { // This is a copy of an existing render, free the passed parameters. target.Dispose(); depth.Dispose(); urp = m_RenderPairs[hash]; urp.ReferenceCount += 1; FilteredConsole.WriteLine(FilterCategory.UniqueRendering, "Storing existing render result (ref+1)."); } else { urp = new UniqueRenderPair(); urp.ReferenceCount = 1; urp.Target = target; urp.DepthMap = depth; m_RenderPairs.Add(hash, urp); FilteredConsole.WriteLine(FilterCategory.UniqueRendering, "Storing new render result (ref=1,mem+1)."); } return(new UniqueRender(urp.Target, urp.DepthMap)); }
public static void ReleaseWaiting(int[] data) { long hash = GetHash(data); if (!m_RenderPairs.Keys.Contains(hash)) { throw new InvalidOperationException(); } UniqueRenderPair urp = m_RenderPairs[hash]; if (urp != null) { return; } m_RenderPairs.Remove(hash); FilteredConsole.WriteLine(FilterCategory.UniqueRendering, "Releasing waiting result."); }
public static UniqueRender Grab(int[] data) { long hash = GetHash(data); if (!m_RenderPairs.Keys.Contains(hash)) { throw new InvalidOperationException(); } UniqueRenderPair urp = m_RenderPairs[hash]; if (urp == null) { throw new InvalidOperationException(); } urp.ReferenceCount += 1; FilteredConsole.WriteLine(FilterCategory.UniqueRendering, "Grabbing existing render result (ref+1)."); return(new UniqueRender(urp.Target, urp.DepthMap)); }
public static void Release(int[] data) { long hash = GetHash(data); if (!m_RenderPairs.Keys.Contains(hash)) { throw new InvalidOperationException(); } UniqueRenderPair urp = m_RenderPairs[hash]; urp.ReferenceCount -= 1; if (urp.ReferenceCount == 0) { urp.Target.Dispose(); urp.DepthMap.Dispose(); m_RenderPairs.Remove(hash); FilteredConsole.WriteLine(FilterCategory.UniqueRendering, "Releasing and freeing render result (ref-1,mem-1)."); } else { FilteredConsole.WriteLine(FilterCategory.UniqueRendering, "Releasing render result (ref-1)."); } }