Example #1
0
        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;
            }
        }
Example #2
0
        /// <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];
            }
        }