private static void PrintDeviceInformation(PhysicalDevice physicalDevice) { var properties = physicalDevice.GetProperties(); Console.WriteLine($"Driver Version: {properties.DriverVersion}"); Console.WriteLine($"Device Name: {properties.DeviceName}"); Console.WriteLine($"Device Type: {properties.DeviceType}"); Console.WriteLine($"Api Version: {Version.ToString(properties.ApiVersion)}"); foreach (var queueFamilyProperties in physicalDevice.GetQueueFamilyProperties()) { Console.WriteLine($"Count of Queues: {queueFamilyProperties.QueueCount}"); Console.WriteLine("Supported operations on this queue: "); if (queueFamilyProperties.QueueFlags.HasFlag(QueueFlags.Graphics)) { Console.WriteLine("\t\tGraphics"); } if (queueFamilyProperties.QueueFlags.HasFlag(QueueFlags.Compute)) { Console.WriteLine("\t\tCompute"); } if (queueFamilyProperties.QueueFlags.HasFlag(QueueFlags.Transfer)) { Console.WriteLine("\t\tTransfer"); } if (queueFamilyProperties.QueueFlags.HasFlag(QueueFlags.SparseBinding)) { Console.WriteLine("\t\tSparse Binding"); } } }
AppGpu AppGpuInit(uint id, PhysicalDevice obj) { // TODO : Limits AppGpu gpu = new AppGpu { Id = id, Obj = obj, Props = obj.GetProperties(), QueueProps = obj.GetQueueFamilyProperties(), MemoryProps = obj.GetMemoryProperties(), Features = obj.GetFeatures(), Limits = null, }; gpu.QueueReqs = new DeviceQueueCreateInfo[gpu.QueueProps.Length]; for (uint i = 0; i < gpu.QueueProps.Length; i++) { uint queueCount = gpu.QueueProps[i].QueueCount; DeviceQueueCreateInfo queueReq = new DeviceQueueCreateInfo { QueueFamilyIndex = i, QueueCount = queueCount, QueuePriorities = new float[queueCount], }; gpu.QueueReqs[i] = queueReq; } gpu.Device = AppDevInit(gpu); AppDevInitFormats(gpu.Device); return(gpu); }
public void CreateDevice() { /* * We create the logical device in this function. */ /* * When creating the device, we also specify what queues it has. */ // Store memory properties of the physical device. PhysicalDeviceMemoryProperties MemoryProperties = physicalDevice.GetMemoryProperties(); PhysicalDeviceFeatures Features = physicalDevice.GetFeatures(); PhysicalDeviceProperties Properties = physicalDevice.GetProperties(); // Create a logical device. var queueCreateInfos = new DeviceQueueCreateInfo[1]; queueCreateInfos[0] = new DeviceQueueCreateInfo(computeQueueFamilyIndex, 1, 1.0f); var deviceCreateInfo = new DeviceCreateInfo( queueCreateInfos, new[] { Constant.DeviceExtension.NVExternalMemory }, Features); device = physicalDevice.CreateDevice(deviceCreateInfo); // Get queue(s). queue = device.GetQueue(computeQueueFamilyIndex); // Create command pool(s). //commandPool = device.CreateCommandPool(new CommandPoolCreateInfo(computeQueueFamilyIndex)); }
public long GetPhysicalDeviceScore(PhysicalDevice device) { long score = 0; var prop = device.GetProperties(); score += prop.Limits.MaxImageDimension2D; return(score); }
public void Write(PhysicalDevice physicalDevice) { WriteLine("PhysicalDeviceProperties:"); WriteLine("========================="); var properties = physicalDevice.GetProperties(); _tabs++; PhysicalDeviceProperties(properties); WriteLine("PhysicalDeviceLimits:"); WriteLine("---------------------"); var limits = properties.Limits; _tabs++; PhysicalDeviceLimits(limits); _tabs--; WriteLine("PhysicalDeviceSparseProperties:"); WriteLine("-------------------------------"); var sparse = properties.SparseProperties; _tabs++; PhysicalDeviceSparseProperties(sparse); _tabs = 0; WriteLine(""); var queueFamilyProperties = physicalDevice.GetQueueFamilyProperties(); for (int x = 0; x < queueFamilyProperties.Length; x++) { WriteLine($"QueueFamilyProperties[{x}]:"); WriteLine("=========================="); _tabs++; QueueFamilyProperties(queueFamilyProperties[x]); _tabs--; WriteLine(""); } _tabs = 0; WriteLine("PhysicalDeviceMemoryProperties"); WriteLine("=============================="); var physicalDeviceMemoryProperties = physicalDevice.GetMemoryProperties(); _tabs++; PhysicalDeviceMemoryProperties(physicalDeviceMemoryProperties); WriteLine(""); _tabs = 0; WriteLine("PhysicalDeviceFeatures:"); WriteLine("======================="); var features = physicalDevice.GetFeatures(); _tabs++; PhysicalDeviceFeatures(features); Console.WriteLine(_sb.ToString()); }
private void PickPhysicalDevice() { var availableDevices = instance.EnumeratePhysicalDevices(); Output.WriteLine("Vulkan - Physical Devices:"); foreach (var device in availableDevices) { Output.WriteLine($" {device.GetProperties().DeviceID} - {device.GetProperties().DeviceName}, Vk v{device.GetProperties().ApiVersion}, Driver v{device.GetProperties().DriverVersion}, Vendor {device.GetProperties().VendorID}, {device.GetProperties().DeviceType}"); } physicalDevice = availableDevices.First(IsSuitableDevice); Output.WriteLine($"Vulkan - Selected Physical Device: {physicalDevice.GetProperties().DeviceID} - {physicalDevice.GetProperties().DeviceName}"); }
public PhysicalDeviceInfo(PhysicalDevice physicalDevice) { PhysicalDevice = physicalDevice; Properties = PhysicalDevice.GetProperties(); QueueFamilyProperties = PhysicalDevice.GetQueueFamilyProperties(); MemoryProperties = PhysicalDevice.GetMemoryProperties(); Features = PhysicalDevice.GetFeatures(); GraphicsQFamilies = Array.AsReadOnly(QueueFamiliesWithFlag(QueueFlags.Graphics)); ComputeQFamilies = Array.AsReadOnly(QueueFamiliesWithFlag(QueueFlags.Compute)); TransferQFamilies = Array.AsReadOnly(QueueFamiliesWithFlag(QueueFlags.Transfer)); SparseBindingQFamilies = Array.AsReadOnly(QueueFamiliesWithFlag(QueueFlags.SparseBinding)); }
/// <summary> /// Initializes a new instance of the <see cref="GraphicsAdapter" /> class. /// </summary> /// <param name="physicalDevice">The default factory.</param> /// <param name="adapterOrdinal">The adapter ordinal.</param> internal GraphicsAdapter(PhysicalDevice defaultPhysicalDevice, int adapterOrdinal) { this.adapterOrdinal = adapterOrdinal; this.defaultPhysicalDevice = defaultPhysicalDevice; defaultPhysicalDevice.GetProperties(out properties); // TODO VULKAN //var displayProperties = physicalDevice.DisplayProperties; //outputs = new GraphicsOutput[displayProperties.Length]; //for (var i = 0; i < outputs.Length; i++) // outputs[i] = new GraphicsOutput(this, displayProperties[i], i).DisposeBy(this); outputs = new[] { new GraphicsOutput() }; }
internal HostDevice( PhysicalDevice vulkanPhysicaldevice, SurfaceType surfaceType, Logger logger = null) { if (vulkanPhysicaldevice == null) { throw new ArgumentNullException(nameof(vulkanPhysicaldevice)); } this.physicalDevice = vulkanPhysicaldevice; this.surfaceType = surfaceType; this.logger = logger; this.properties = vulkanPhysicaldevice.GetProperties(); this.deviceMemoryProperties = vulkanPhysicaldevice.GetMemoryProperties(); this.supportedFeatures = vulkanPhysicaldevice.GetFeatures(); this.availableExtensions = vulkanPhysicaldevice.EnumerateExtensionProperties(); this.queueFamilies = vulkanPhysicaldevice.GetQueueFamilyProperties(); logger?.Log(nameof(HostDevice), $"Found device: {Name}"); logger?.LogList(nameof(HostDevice), $"{Name} available extensions:", availableExtensions); }
public Context(GameWindow window) { Window = window; Instance = ToDispose(VKHelper.CreateInstance()); DebugReportCallback = ToDispose(VKHelper.CreateDebugReportCallback(Instance)); Surface = ToDispose(VKHelper.CreateSurface(Instance, Window.Handle)); foreach (PhysicalDevice physicalDevice in Instance.EnumeratePhysicalDevices()) { QueueFamilyProperties[] queueFamilyProperties = physicalDevice.GetQueueFamilyProperties(); for (int i = 0; i < queueFamilyProperties.Length; i++) { if (queueFamilyProperties[i].QueueFlags.HasFlag(Queues.Graphics)) { if (GraphicsQueueFamilyIndex == -1) { GraphicsQueueFamilyIndex = i; } if (ComputeQueueFamilyIndex == -1) { ComputeQueueFamilyIndex = i; } if (physicalDevice.GetSurfaceSupportKhr(i, Surface) && VKHelper.GetPresentationSupport(physicalDevice, i)) { PresentQueueFamilyIndex = i; } if (GraphicsQueueFamilyIndex != -1 && ComputeQueueFamilyIndex != -1 && PresentQueueFamilyIndex != -1) { PhysicalDevice = physicalDevice; break; } } } if (PhysicalDevice != null) { break; } } if (PhysicalDevice == null) { throw new InvalidOperationException("No suitable physical device found."); } GenerateDepthStencilFormat(); // Store memory properties of the physical device. MemoryProperties = PhysicalDevice.GetMemoryProperties(); Features = PhysicalDevice.GetFeatures(); Properties = PhysicalDevice.GetProperties(); // Create a logical device. bool sameGraphicsAndPresent = GraphicsQueueFamilyIndex == PresentQueueFamilyIndex; var queueCreateInfos = new DeviceQueueCreateInfo[sameGraphicsAndPresent ? 1 : 2]; queueCreateInfos[0] = new DeviceQueueCreateInfo(GraphicsQueueFamilyIndex, 1, 1.0f); if (!sameGraphicsAndPresent) { queueCreateInfos[1] = new DeviceQueueCreateInfo(PresentQueueFamilyIndex, 1, 1.0f); } var deviceCreateInfo = new DeviceCreateInfo( queueCreateInfos, new[] { Constant.DeviceExtension.KhrSwapchain, Constant.DeviceExtension.KhrMaintenance1 }, Features); Device = PhysicalDevice.CreateDevice(deviceCreateInfo); // Get queue(s). GraphicsQueue = Device.GetQueue(GraphicsQueueFamilyIndex); ComputeQueue = ComputeQueueFamilyIndex == GraphicsQueueFamilyIndex ? GraphicsQueue : Device.GetQueue(ComputeQueueFamilyIndex); PresentQueue = PresentQueueFamilyIndex == GraphicsQueueFamilyIndex ? GraphicsQueue : Device.GetQueue(PresentQueueFamilyIndex); Content = new Content(this); GraphicsCommandPool = ToDispose(Device.CreateCommandPool(new CommandPoolCreateInfo(GraphicsQueueFamilyIndex, CommandPoolCreateFlags.ResetCommandBuffer))); ComputeCommandPool = ToDispose(Device.CreateCommandPool(new CommandPoolCreateInfo(ComputeQueueFamilyIndex))); Graphics = ToDispose(new Graphics(this)); Build(); }
public void GetProperties() { PhysicalDeviceProperties properties = PhysicalDevice.GetProperties(); Assert.True(properties.DeviceName.Length > 0); }
/// <summary> /// Score a physical device based on features and capabilities /// </summary> /// <param name="device"></param> /// <returns></returns> private static double GetDeviceScore(PhysicalDevice device) { var limits = device.GetProperties().Limits; return(limits.MaxVertexInputAttributes / 16.0); }
/// <summary> /// Get whether a physical device meets requirement features and capabilities /// </summary> /// <param name="device"></param> /// <returns></returns> private static bool GetDeviceMeetsRequirements(PhysicalDevice device, SurfaceKhr surface) { // Argument checks if (device is null) { throw new ArgumentNullException(nameof(device)); } if (surface is null) { throw new ArgumentNullException(nameof(surface)); } // Check device features { var features = device.GetFeatures(); if (!features.SamplerAnisotropy) { return(false); } var limits = device.GetProperties().Limits; if (limits.MaxVertexInputAttributes < 16) { return(false); } if (limits.MaxUniformBufferRange < sizeof(float) * 4 * 254) { return(false); } if (limits.MaxVertexInputBindings < 2) { return(false); } if (limits.MaxPointSize <= 1) { return(false); } } // Check queue families { var families = device.GetQueueFamilyProperties(); // Graphics, compute, transfer { if (families.Count(family => QueueFamily.Supports(family, Queues.Graphics)) == 0 || families.Count(family => QueueFamily.Supports(family, Queues.Compute)) == 0 || families.Count(family => QueueFamily.Supports(family, Queues.Transfer)) == 0) { return(false); } } // Present { var foundPresent = false; for (var i = 0; i < families.Length; i++) { if (QueueFamily.SupportsPresenting(i, device, surface)) { foundPresent = true; break; } } if (!foundPresent) { return(false); } } } return(true); }
public static string GetName(this PhysicalDevice @this) { return(@this.GetProperties().DeviceName); }
public VulkanContext(Instance instance, SurfaceKhr surface, Platform platform) { // Find graphics and presentation capable physical device(s) that support // the provided surface for platform. int graphicsQueueFamilyIndex = -1; int computeQueueFamilyIndex = -1; int presentQueueFamilyIndex = -1; foreach (PhysicalDevice physicalDevice in instance.EnumeratePhysicalDevices()) { QueueFamilyProperties[] queueFamilyProperties = physicalDevice.GetQueueFamilyProperties(); for (int i = 0; i < queueFamilyProperties.Length; i++) { if (queueFamilyProperties[i].QueueFlags.HasFlag(Queues.Graphics)) { if (graphicsQueueFamilyIndex == -1) { graphicsQueueFamilyIndex = i; } if (computeQueueFamilyIndex == -1) { computeQueueFamilyIndex = i; } if (physicalDevice.GetSurfaceSupportKhr(i, surface) && GetPresentationSupport(physicalDevice, i)) { presentQueueFamilyIndex = i; } if (graphicsQueueFamilyIndex != -1 && computeQueueFamilyIndex != -1 && presentQueueFamilyIndex != -1) { PhysicalDevice = physicalDevice; break; } } } if (PhysicalDevice != null) { break; } } bool GetPresentationSupport(PhysicalDevice physicalDevice, int queueFamilyIndex) { switch (platform) { case Platform.Android: return(true); case Platform.Win32: return(physicalDevice.GetWin32PresentationSupportKhr(queueFamilyIndex)); default: throw new NotImplementedException(); } } if (PhysicalDevice == null) { throw new InvalidOperationException("No suitable physical device found."); } // Store memory properties of the physical device. MemoryProperties = PhysicalDevice.GetMemoryProperties(); Features = PhysicalDevice.GetFeatures(); Properties = PhysicalDevice.GetProperties(); // Create a logical device. bool sameGraphicsAndPresent = graphicsQueueFamilyIndex == presentQueueFamilyIndex; var queueCreateInfos = new DeviceQueueCreateInfo[sameGraphicsAndPresent ? 1 : 2]; queueCreateInfos[0] = new DeviceQueueCreateInfo(graphicsQueueFamilyIndex, 1, 1.0f); if (!sameGraphicsAndPresent) { queueCreateInfos[1] = new DeviceQueueCreateInfo(presentQueueFamilyIndex, 1, 1.0f); } var deviceCreateInfo = new DeviceCreateInfo( queueCreateInfos, new[] { Constant.DeviceExtension.KhrSwapchain }, Features); Device = PhysicalDevice.CreateDevice(deviceCreateInfo); // Get queue(s). GraphicsQueue = Device.GetQueue(graphicsQueueFamilyIndex); ComputeQueue = computeQueueFamilyIndex == graphicsQueueFamilyIndex ? GraphicsQueue : Device.GetQueue(computeQueueFamilyIndex); PresentQueue = presentQueueFamilyIndex == graphicsQueueFamilyIndex ? GraphicsQueue : Device.GetQueue(presentQueueFamilyIndex); // Create command pool(s). GraphicsCommandPool = Device.CreateCommandPool(new CommandPoolCreateInfo(graphicsQueueFamilyIndex)); ComputeCommandPool = Device.CreateCommandPool(new CommandPoolCreateInfo(computeQueueFamilyIndex)); }