//VkMemoryPropertyFlagBits.VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT private uint GetMemoryTypeIndex(VkPhysicalDeviceMemoryProperties memoryProperties, VkMemoryRequirements memoryReq, VkMemoryPropertyFlagBits flags) { uint result = 0; bool heapIndexSet = false; VkMemoryType *memoryTypes = (VkMemoryType *)memoryProperties.memoryTypes; for (uint i = 0; i < memoryProperties.memoryTypeCount; i++) { if (((memoryReq.memoryTypeBits >> (int)i) & 1) == 1 && (memoryTypes[i].propertyFlags & flags) == flags) { result = i; heapIndexSet = true; break; } } if (!heapIndexSet) { result = memoryTypes[0].heapIndex; } return(result); }
/// <summary> /// Gets the memory heaps and types for the device. /// </summary> /// <param name="device">The device to get the memory info for.</param> /// <param name="types">The memory types for the device.</param> /// <param name="heaps">The memory heaps for the device.</param> public static void GetMemoryInfo(VkPhysicalDevice device, out VkMemoryType[] types, out VkMemoryHeap[] heaps) { if (!device) { throw new ArgumentNullException(nameof(device), "Cannot pass null device or device handle"); } VkPhysicalDeviceMemoryProperties.New(out var props); device.GetPhysicalDeviceMemoryProperties(&props); VkMemoryType *typePtr = &(props.MemoryTypes_0); VkMemoryHeap *heapPtr = &(props.MemoryHeaps_0); types = new VkMemoryType[props.MemoryTypeCount]; heaps = new VkMemoryHeap[props.MemoryHeapCount]; for (uint i = 0; i < props.MemoryTypeCount; ++i) { types[i] = typePtr[i]; } for (uint i = 0; i < props.MemoryHeapCount; ++i) { heaps[i] = heapPtr[i]; } }