Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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.");
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        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).");
            }
        }