private void Initialize() { Context.PhysicalDevice.GetMemoryProperties(out var physicalDeviceMemoryProperties); memoryTypes = new MemoryType[physicalDeviceMemoryProperties.MemoryTypeCount]; for (var i = 0U; i < physicalDeviceMemoryProperties.MemoryTypeCount; i++) { var vkMemoryType = &physicalDeviceMemoryProperties.MemoryTypes.Value0 + i; var vkMemoryHeap = &physicalDeviceMemoryProperties.MemoryHeaps.Value0 + vkMemoryType->HeapIndex; var blockSize = PickBlockSize(vkMemoryHeap->Size); var minAlignment = GetMemoryTypeMinAlignment(vkMemoryType->PropertyFlags); memoryTypes[i] = new MemoryType(i, vkMemoryType->PropertyFlags, blockSize, minAlignment); } memoryPoolsLinear = new List <MemoryBlock> [memoryTypes.Length]; memoryPoolsNonLinear = new List <MemoryBlock> [memoryTypes.Length]; for (var i = 0; i < memoryTypes.Length; i++) { memoryPoolsLinear[i] = new List <MemoryBlock>(); memoryPoolsNonLinear[i] = new List <MemoryBlock>(); } }
private DeviceMemory TryAllocateDeviceMemory(MemoryType type, ulong size, SharpVulkan.Ext.MemoryDedicatedAllocateInfo *dedicatedAllocateInfo) { var allocateInfo = new SharpVulkan.MemoryAllocateInfo { StructureType = SharpVulkan.StructureType.MemoryAllocateInfo, MemoryTypeIndex = type.Index, AllocationSize = size, Next = new IntPtr(dedicatedAllocateInfo) }; DeviceMemory memory; try { memory = new DeviceMemory(Context.Device.AllocateMemory(ref allocateInfo), type, size); } catch (SharpVulkan.SharpVulkanException e) when(e.Result == SharpVulkan.Result.ErrorOutOfDeviceMemory) { return(null); } if (ShouldMapPersistenly(type)) { MapDeviceMemory(memory); } return(memory); }
public DeviceMemory(SharpVulkan.DeviceMemory memory, MemoryType type, ulong size) { Memory = memory; Type = type; Size = size; }
private bool ShouldMapPersistenly(MemoryType type) { return(PreferPersistentMapping && (type.PropertyFlags & SharpVulkan.MemoryPropertyFlags.HostVisible) != 0); }