示例#1
0
        public static bool TryAllocateMemoryForBuffer(ulong size, VkDevice device, VkPhysicalDevice pDevice, ref VkMemoryRequirements memoryRequirements, ref VkMemoryPropertyFlags memoryProperties, out ulong offset, out VkDeviceMemory mem)
        {
            if (size > Buffer.LargestBufferSize)
            {
                Buffer.LargestBufferSize = size;
            }

            if (size >= Buffer.LargePooledBufferSize)
            {
                offset = 0;
                mem    = VkDeviceMemory.Null;
                Buffer.PoolMissesDueToSize++;
                return(false);
            }
            else if (size >= Buffer.SmallPooledBufferSize)
            {
                if (BigMemoryPool == VkDeviceMemory.Null)
                {
                    AllocatePool(out BigMemoryPool, ref device, ref pDevice, ref memoryProperties, ref memoryRequirements, Buffer.LargePooledBufferCount * Buffer.LargePooledBufferSize);
                    for (ulong i = 0; i < Buffer.LargePooledBufferCount; i++)
                    {
                        FreeBig.Enqueue(i * Buffer.LargePooledBufferSize);
                    }
                }

                if (FreeBig.TryDequeue(out offset))
                {
                    Buffer.CurrentFreeBigPool = FreeBig.Count;
                    mem = BigMemoryPool;
                    return(true);
                }
            }
            else
            {
                if (SmallMemoryPool == VkDeviceMemory.Null)
                {
                    AllocatePool(out SmallMemoryPool, ref device, ref pDevice, ref memoryProperties, ref memoryRequirements, Buffer.SmallPooledBufferCount * Buffer.SmallPooledBufferSize);
                    for (ulong i = 0; i < Buffer.SmallPooledBufferCount; i++)
                    {
                        FreeSmall.Enqueue(i * Buffer.SmallPooledBufferSize);
                    }
                }

                if (FreeSmall.TryDequeue(out offset))
                {
                    Buffer.CurrentFreeSmallPool = FreeSmall.Count;
                    mem = SmallMemoryPool;
                    return(true);
                }
            }

            offset = 0;
            mem    = VkDeviceMemory.Null;
            Buffer.PoolMissesDueToExaustion++;
            return(false);
        }
示例#2
0
        public static bool Free(Buffer buf, ulong offset)
        {
            if (BigMemoryPool != VkDeviceMemory.Null && (ulong)buf.SizeInBytes >= Buffer.SmallPooledBufferSize)
            {
                FreeBig.Enqueue(offset);
                Buffer.CurrentFreeBigPool = FreeBig.Count;
                return(true);
            }
            else if (SmallMemoryPool != VkDeviceMemory.Null)
            {
                FreeSmall.Enqueue(offset);
                Buffer.CurrentFreeSmallPool = FreeSmall.Count;
                return(true);
            }

            return(false);
        }