Exemplo n.º 1
0
 public DeviceCreateInfo
 (
     StructureType sType       = StructureType.DeviceCreateInfo,
     void *pNext               = default,
     uint flags                = default,
     uint queueCreateInfoCount = default,
     DeviceQueueCreateInfo *pQueueCreateInfos = default,
     uint enabledLayerCount                   = default,
     byte **ppEnabledLayerNames               = default,
     uint enabledExtensionCount               = default,
     byte **ppEnabledExtensionNames           = default,
     PhysicalDeviceFeatures *pEnabledFeatures = default
 )
 {
     SType = sType;
     PNext = pNext;
     Flags = flags;
     QueueCreateInfoCount    = queueCreateInfoCount;
     PQueueCreateInfos       = pQueueCreateInfos;
     EnabledLayerCount       = enabledLayerCount;
     PpEnabledLayerNames     = ppEnabledLayerNames;
     EnabledExtensionCount   = enabledExtensionCount;
     PpEnabledExtensionNames = ppEnabledExtensionNames;
     PEnabledFeatures        = pEnabledFeatures;
 }
Exemplo n.º 2
0
        internal unsafe VulkanLogicalDevice(Vk vk, VulkanContext context, string[] extensions, string[]?validationLayers) : base(vk)
        {
            _Context           = context;
            SwapchainExtension = GetDeviceExtension <SwapchainExtension>();

            float queuePriority = 1f;
            QueueFamilyIndices queueFamilyIndices = _Context.PhysicalDevice.GetQueueFamilies();
            uint queueFamiliesCount = queueFamilyIndices.GetLength;
            DeviceQueueCreateInfo *deviceQueueCreateInfos = stackalloc DeviceQueueCreateInfo[2];

            for (int i = 0; i < queueFamiliesCount; i++)
            {
                Debug.Assert(queueFamilyIndices[i] != null);

                deviceQueueCreateInfos[i] = new DeviceQueueCreateInfo
                {
                    SType            = StructureType.DeviceQueueCreateInfo,
                    QueueFamilyIndex = queueFamilyIndices[i] !.Value,
                    QueueCount       = 1,
                    PQueuePriorities = &queuePriority
                };
            }

            nint extensionsPointer       = SilkMarshal.StringArrayToPtr(extensions);
            nint?validationLayersPointer = null;

            DeviceCreateInfo deviceCreateInfo = new DeviceCreateInfo
            {
                SType = StructureType.DeviceCreateInfo,
                EnabledExtensionCount   = (uint)extensions.Length,
                PpEnabledExtensionNames = (byte **)extensionsPointer,
                QueueCreateInfoCount    = queueFamiliesCount,
                PQueueCreateInfos       = deviceQueueCreateInfos,
                PEnabledFeatures        = (PhysicalDeviceFeatures *)null !,
                EnabledLayerCount       = 0,
                PpEnabledLayerNames     = null
            };

            if (validationLayers is not null)
            {
                validationLayersPointer              = SilkMarshal.StringArrayToPtr(validationLayers);
                deviceCreateInfo.EnabledLayerCount   = (uint)validationLayers.Length;
                deviceCreateInfo.PpEnabledLayerNames = (byte **)validationLayersPointer.Value;
            }

            Result result = VK.CreateDevice(_Context.PhysicalDevice, &deviceCreateInfo, (AllocationCallbacks *)null !, out _LogicalDevice);

            if (result is not Result.Success)
            {
                throw new VulkanException(result, "Failed to create logical device.");
            }

            VK.GetDeviceQueue(this, queueFamilyIndices.GraphicsFamily !.Value, 0, out _GraphicsQueue);
            VK.GetDeviceQueue(this, queueFamilyIndices.PresentationFamily !.Value, 0, out _PresentationQueue);

            SilkMarshal.Free(extensionsPointer);

            if (validationLayersPointer is not null)
            {
                SilkMarshal.Free(validationLayersPointer.Value);
            }
        }
Exemplo n.º 3
0
        public DeviceCreateInfo
        (
            StructureType?sType       = StructureType.DeviceCreateInfo,
            void *pNext               = null,
            uint?flags                = null,
            uint?queueCreateInfoCount = null,
            DeviceQueueCreateInfo *pQueueCreateInfos = null,
            uint?enabledLayerCount                   = null,
            byte **ppEnabledLayerNames               = null,
            uint?enabledExtensionCount               = null,
            byte **ppEnabledExtensionNames           = null,
            PhysicalDeviceFeatures *pEnabledFeatures = null
        ) : this()
        {
            if (sType is not null)
            {
                SType = sType.Value;
            }

            if (pNext is not null)
            {
                PNext = pNext;
            }

            if (flags is not null)
            {
                Flags = flags.Value;
            }

            if (queueCreateInfoCount is not null)
            {
                QueueCreateInfoCount = queueCreateInfoCount.Value;
            }

            if (pQueueCreateInfos is not null)
            {
                PQueueCreateInfos = pQueueCreateInfos;
            }

            if (enabledLayerCount is not null)
            {
                EnabledLayerCount = enabledLayerCount.Value;
            }

            if (ppEnabledLayerNames is not null)
            {
                PpEnabledLayerNames = ppEnabledLayerNames;
            }

            if (enabledExtensionCount is not null)
            {
                EnabledExtensionCount = enabledExtensionCount.Value;
            }

            if (ppEnabledExtensionNames is not null)
            {
                PpEnabledExtensionNames = ppEnabledExtensionNames;
            }

            if (pEnabledFeatures is not null)
            {
                PEnabledFeatures = pEnabledFeatures;
            }
        }