internal PhysicalDevice(Instance instance, VkPhysicalDevice handle) { Instance = instance; Handle = handle; unsafe { var props = Handle.GetPhysicalDeviceProperties(); _properties = props; DeviceName = Marshal.PtrToStringAnsi(new IntPtr(props.DeviceName)); { var memProps = Handle.GetPhysicalDeviceMemoryProperties(); var heapList = new List <MemoryHeap>((int)memProps.MemoryHeapCount); for (uint i = 0; i < memProps.MemoryHeapCount; i++) { heapList.Add(new MemoryHeap(i, memProps.MemoryHeaps[(int)i])); } MemoryHeaps = heapList; var typeList = new List <MemoryType>((int)memProps.MemoryTypeCount); for (uint i = 0; i < memProps.MemoryTypeCount; i++) { typeList.Add(new MemoryType(i, heapList[(int)memProps.MemoryTypes[(int)i].HeapIndex], (VkMemoryPropertyFlag)memProps.MemoryTypes[(int)i].PropertyFlags)); } MemoryTypes = typeList; } } { ExtensionProperties = new List <VkExtensionProperties>(Handle.EnumerateExtensionProperties(null)); LayerProperties = new List <VkLayerProperties>(Handle.EnumerateLayerProperties()); var availableExt = new HashSet <ExtensionDescriptionAttribute>(); foreach (var ext in ExtensionProperties) { var desc = VkExtensionDatabase.Extension(ext.ExtensionNameString); if (desc != null) { availableExt.Add(desc); } } AvailableExtensions = availableExt; } }
/// <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]; } }