예제 #1
0
        private void GetAllInstanceExtensionsAvailables()
        {
            uint extensionCount;

            Helpers.CheckErrors(VulkanNative.vkEnumerateInstanceExtensionProperties(null, &extensionCount, null));
            VkExtensionProperties *extensions = stackalloc VkExtensionProperties[(int)extensionCount];

            Helpers.CheckErrors(VulkanNative.vkEnumerateInstanceExtensionProperties(null, &extensionCount, extensions));

            for (int i = 0; i < extensionCount; i++)
            {
                Debug.WriteLine($"Extension: {Helpers.GetString(extensions[i].extensionName)} version: {extensions[i].specVersion}");
            }

            // Return
            //Extension: VK_KHR_device_group_creation version: 1
            //Extension: VK_KHR_external_fence_capabilities version: 1
            //Extension: VK_KHR_external_memory_capabilities version: 1
            //Extension: VK_KHR_external_semaphore_capabilities version: 1
            //Extension: VK_KHR_get_physical_device_properties2 version: 2
            //Extension: VK_KHR_get_surface_capabilities2 version: 1
            //Extension: VK_KHR_surface version: 25
            //Extension: VK_KHR_surface_protected_capabilities version: 1
            //Extension: VK_KHR_win32_surface version: 6
            //Extension: VK_EXT_debug_report version: 9
            //Extension: VK_EXT_debug_utils version: 2
            //Extension: VK_EXT_swapchain_colorspace version: 4
            //Extension: VK_NV_external_memory_capabilities version: 1
        }
예제 #2
0
파일: VulkanDevice.cs 프로젝트: gomson/vk
        public vksVulkanDevice(VkPhysicalDevice physicalDevice)
        {
            Debug.Assert(physicalDevice.Handle != IntPtr.Zero);
            PhysicalDevice = physicalDevice;

            // Store Properties features, limits and properties of the physical device for later use
            // Device properties also contain limits and sparse properties
            VkPhysicalDeviceProperties properties;

            vkGetPhysicalDeviceProperties(physicalDevice, out properties);
            Properties = properties;
            // Features should be checked by the examples before using them
            VkPhysicalDeviceFeatures features;

            vkGetPhysicalDeviceFeatures(physicalDevice, out features);
            Features = features;
            // Memory properties are used regularly for creating all kinds of buffers
            VkPhysicalDeviceMemoryProperties memoryProperties;

            vkGetPhysicalDeviceMemoryProperties(physicalDevice, out memoryProperties);
            MemoryProperties = memoryProperties;
            // Queue family properties, used for setting up requested queues upon device creation
            uint queueFamilyCount = 0;

            vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, ref queueFamilyCount, null);
            Debug.Assert(queueFamilyCount > 0);
            QueueFamilyProperties.Resize(queueFamilyCount);
            vkGetPhysicalDeviceQueueFamilyProperties(
                physicalDevice,
                &queueFamilyCount,
                (VkQueueFamilyProperties *)QueueFamilyProperties.Data.ToPointer());
            QueueFamilyProperties.Count = queueFamilyCount;

            // Get list of supported extensions
            uint extCount = 0;

            vkEnumerateDeviceExtensionProperties(physicalDevice, (byte *)null, ref extCount, null);
            if (extCount > 0)
            {
                VkExtensionProperties *extensions = stackalloc VkExtensionProperties[(int)extCount];
                if (vkEnumerateDeviceExtensionProperties(physicalDevice, (byte *)null, ref extCount, extensions) == VkResult.Success)
                {
                    for (uint i = 0; i < extCount; i++)
                    {
                        var ext = extensions[i];
                        // supportedExtensions.push_back(ext.extensionName);
                        // TODO: fixed-length char arrays are not being parsed correctly.
                    }
                }
            }
        }
예제 #3
0
        public static List <string> EnumerateInstanceExtensions()
        {
            uint Count = 0;

            vkEnumerateInstanceExtensionProperties((byte *)null, ref Count, null);
            VkExtensionProperties *ext = stackalloc VkExtensionProperties[(int)Count];

            vkEnumerateInstanceExtensionProperties((byte *)null, ref Count, ext);


            List <string> extensionName = new List <string>();

            for (int i = 0; i < Count; i++)
            {
                extensionName.Add(Interop.String.FromPointer(ext[i].extensionName));
            }

            return(extensionName);
        }
예제 #4
0
        private bool CheckPhysicalDeviceExtensionSupport(VkPhysicalDevice physicalDevice)
        {
            uint extensionCount;

            Helpers.CheckErrors(VulkanNative.vkEnumerateDeviceExtensionProperties(physicalDevice, null, &extensionCount, null));

            VkExtensionProperties *availableExtensions = stackalloc VkExtensionProperties[(int)extensionCount];

            Helpers.CheckErrors(VulkanNative.vkEnumerateDeviceExtensionProperties(physicalDevice, null, &extensionCount, availableExtensions));

            HashSet <string> requiredExtensions = new HashSet <string>(deviceExtensions);

            for (int i = 0; i < extensionCount; i++)
            {
                var extension = availableExtensions[i];
                requiredExtensions.Remove(Helpers.GetString(extension.extensionName));
            }

            return(requiredExtensions.Count == 0);
        }
예제 #5
0
        public string[] EnumerateInstanceExtensions()
        {
            uint     propCount = 0;
            VkResult result    = VulkanNative.vkEnumerateInstanceExtensionProperties((byte *)null, &propCount, null);

            Helpers.CheckErrors(result);

            if (propCount == 0)
            {
                return(Array.Empty <string>());
            }

            VkExtensionProperties *props = stackalloc VkExtensionProperties[(int)propCount];

            VulkanNative.vkEnumerateInstanceExtensionProperties((byte *)null, &propCount, props);

            string[] ret = new string[propCount];
            for (int i = 0; i < propCount; i++)
            {
                ret[i] = Marshal.PtrToStringAnsi((IntPtr)props[i].extensionName);
            }

            return(ret);
        }
예제 #6
0
        private void CreateLogicalDevice()
        {
            GetQueueFamilyIndices();

            HashSet <uint> familyIndices = new HashSet <uint> {
                _graphicsQueueIndex, _presentQueueIndex
            };
            RawList <VkDeviceQueueCreateInfo> queueCreateInfos = new RawList <VkDeviceQueueCreateInfo>();

            foreach (uint index in familyIndices)
            {
                VkDeviceQueueCreateInfo queueCreateInfo = VkDeviceQueueCreateInfo.New();
                queueCreateInfo.queueFamilyIndex = _graphicsQueueIndex;
                queueCreateInfo.queueCount       = 1;
                float priority = 1f;
                queueCreateInfo.pQueuePriorities = &priority;
                queueCreateInfos.Add(queueCreateInfo);
            }

            VkPhysicalDeviceFeatures deviceFeatures = new VkPhysicalDeviceFeatures();

            deviceFeatures.samplerAnisotropy = true;
            deviceFeatures.fillModeNonSolid  = true;
            deviceFeatures.geometryShader    = true;
            deviceFeatures.depthClamp        = true;

            bool debugMarkerSupported = false;

            uint     propertyCount = 0;
            VkResult result        = vkEnumerateDeviceExtensionProperties(_physicalDevice, (byte *)null, &propertyCount, null);

            CheckResult(result);
            VkExtensionProperties *properties = stackalloc VkExtensionProperties[(int)propertyCount];

            result = vkEnumerateDeviceExtensionProperties(_physicalDevice, (byte *)null, &propertyCount, properties);
            CheckResult(result);

            for (int i = 0; i < propertyCount; i++)
            {
                if (Util.GetString(properties[i].extensionName) == "VK_EXT_debug_marker")
                {
                    Console.WriteLine("VK_EXT_debug_marker is available.");
                    debugMarkerSupported = true;
                    break;
                }
            }

            VkDeviceCreateInfo deviceCreateInfo = VkDeviceCreateInfo.New();

            fixed(VkDeviceQueueCreateInfo *qciPtr = &queueCreateInfos.Items[0])
            {
                deviceCreateInfo.pQueueCreateInfos    = qciPtr;
                deviceCreateInfo.queueCreateInfoCount = queueCreateInfos.Count;

                deviceCreateInfo.pEnabledFeatures = &deviceFeatures;

                StackList <IntPtr> layerNames = new StackList <IntPtr>();

                layerNames.Add(CommonStrings.StandardValidationLayerName);
                deviceCreateInfo.enabledLayerCount   = layerNames.Count;
                deviceCreateInfo.ppEnabledLayerNames = (byte **)layerNames.Data;

                StackList <IntPtr> extensionNames = new StackList <IntPtr>();

                extensionNames.Add(CommonStrings.VK_KHR_SWAPCHAIN_EXTENSION_NAME);
                if (debugMarkerSupported)
                {
                    extensionNames.Add(CommonStrings.VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
                    _debugMarkerEnabled = true;
                }
                deviceCreateInfo.enabledExtensionCount   = extensionNames.Count;
                deviceCreateInfo.ppEnabledExtensionNames = (byte **)extensionNames.Data;

                result = vkCreateDevice(_physicalDevice, ref deviceCreateInfo, null, out _device);
                CheckResult(result);
            }

            vkGetDeviceQueue(_device, _graphicsQueueIndex, 0, out _graphicsQueue);
            vkGetDeviceQueue(_device, _presentQueueIndex, 0, out _presentQueue);

            if (debugMarkerSupported)
            {
                IntPtr setObjectNamePtr;
                using (FixedUtf8String debugExtFnName = "vkDebugMarkerSetObjectNameEXT")
                {
                    setObjectNamePtr = vkGetInstanceProcAddr(_instance, debugExtFnName);
                }

                _setObjectNameDelegate = Marshal.GetDelegateForFunctionPointer <vkDebugMarkerSetObjectNameEXT_d>(setObjectNamePtr);
            }
        }
예제 #7
0
 public static extern VkResult vpGetProfileDeviceExtensionProperties([NativeTypeName("const VpProfileProperties *")] VpProfileProperties *pProfile, [NativeTypeName("uint32_t *")] uint *pPropertyCount, VkExtensionProperties *pProperties);
예제 #8
0
        private VkPhysicalDevice PickPhysicalDevice()
        {
            uint deviceCount;

            VK.EnumeratePhysicalDevices(Instance, &deviceCount, null);

            if (deviceCount > 0)
            {
                VkPhysicalDevice *devices = stackalloc VkPhysicalDevice[(int)deviceCount];
                VkPhysicalDevice *valid   = stackalloc VkPhysicalDevice[(int)deviceCount];
                VK.EnumeratePhysicalDevices(Instance, &deviceCount, devices);

                // find valid devices
                int validCount = 0;
                for (int i = 0; i < deviceCount; i++)
                {
                    if (IsValidPhysicalDevice(devices[i]))
                    {
                        valid[validCount++] = devices[i];
                    }
                }

                // find the best device
                if (validCount > 0)
                {
                    for (int i = 0; i < validCount; i++)
                    {
                        VkPhysicalDeviceProperties properties;
                        VK.GetPhysicalDeviceProperties(devices[i], &properties);

                        if (properties.deviceType == VkPhysicalDeviceType.DiscreteGpu)
                        {
                            return(valid[i]);
                        }
                    }

                    return(valid[0]);
                }
            }

            throw new Exception("Failed to find any GPUs that support Vulkan");

            bool IsValidPhysicalDevice(VkPhysicalDevice device)
            {
                if (!TryGetQueueFamilyIndex(device, VkQueueFlags.GraphicsBit, out _))
                {
                    return(false);
                }

                uint extensionCount;

                VK.EnumerateDeviceExtensionProperties(device, null, &extensionCount, null);
                VkExtensionProperties *availableExtensions = stackalloc VkExtensionProperties[(int)extensionCount];

                VK.EnumerateDeviceExtensionProperties(device, null, &extensionCount, availableExtensions);

                foreach (var str in deviceExtensions)
                {
                    var hasExtension = false;
                    for (int j = 0; j < extensionCount && !hasExtension; j++)
                    {
                        if (str == VK.STRING(availableExtensions[j].extensionName))
                        {
                            hasExtension = true;
                        }
                    }

                    if (!hasExtension)
                    {
                        return(false);
                    }
                }

                return(true);
            }
        }