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); }
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); }