Beispiel #1
0
        void CreateInstance()
        {
            //LayerProperties[] available_layers = DelegateUtility.EnumerateToArray<LayerProperties> ( vk.EnumerateInstanceLayerProperties );

            ExtensionProperties[] available_extensions = DelegateUtility.EnumerateToArray <ExtensionProperties> (vk.EnumerateInstanceExtensionProperties, IntPtr.Zero);

            List <string> extensions = new List <string> {
                KhrWin32Surface.EXTENSION_NAME, KhrSurface.EXTENSION_NAME
            };

            for (int i = 0; i < extensions.Count; ++i)
            {
                if (!CheckExtensionAvailability(extensions[i], available_extensions))
                {
                    //std::cout << "Could not find instance extension named \"" << extensions[i] << "\"!" << std::endl;
                    return;
                }
            }

            if (CheckExtensionAvailability(ExtDebugReport.EXTENSION_NAME, available_extensions))
            {
                extensions.Add(ExtDebugReport.EXTENSION_NAME);
                supportDebugReport = true;
            }


            var exPtr = MarshalUtility.AllocateString(extensions);

            ApplicationInfo application_info = new ApplicationInfo
            {
                sType              = StructureType.ApplicationInfo,
                pNext              = IntPtr.Zero,
                pApplicationName   = (byte *)Marshal.StringToHGlobalAnsi("Vulkan Window"),
                applicationVersion = new Version(1, 0, 0),
                pEngineName        = (byte *)Marshal.StringToHGlobalAnsi("Vulkan Tutorial"),
                engineVersion      = new Version(1, 0, 0),
                apiVersion         = new Version(1, 0, 0),
            };

            InstanceCreateInfo instance_create_info = new InstanceCreateInfo
            {
                sType                   = StructureType.InstanceCreateInfo,
                pNext                   = IntPtr.Zero,
                flags                   = 0,
                pApplicationInfo        = &application_info,
                enabledLayerCount       = 0,
                ppEnabledLayerNames     = (byte *)0,
                enabledExtensionCount   = (uint)extensions.Count,
                ppEnabledExtensionNames = (byte *)exPtr,
            };

            vk.CreateInstance(ref instance_create_info, (AllocationCallbacks *)0, out vulkan.Instance).CheckError();

            MarshalUtility.FreeString(exPtr, extensions.Count);

            Marshal.FreeHGlobal((IntPtr)application_info.pApplicationName);
            Marshal.FreeHGlobal((IntPtr)application_info.pEngineName);
        }
Beispiel #2
0
        void CreateDevice()
        {
            PhysicalDevice[] physical_devices = DelegateUtility.EnumerateToArray <PhysicalDevice> (vk.EnumeratePhysicalDevices, (IntPtr)vulkan.Instance);

            if (physical_devices == null)
            {
                //std::cout << "Error occurred during physical devices enumeration!" << std::endl;
                return;
            }

            uint selected_graphics_queue_family_index = uint.MaxValue;
            uint selected_present_queue_family_index  = uint.MaxValue;

            for (int i = 0; i < physical_devices.Length; ++i)
            {
                if (CheckPhysicalDeviceProperties(physical_devices[i],
                                                  out selected_graphics_queue_family_index, out selected_present_queue_family_index))
                {
                    vulkan.PhysicalDevice = physical_devices[i];
                }
            }

            if (vulkan.PhysicalDevice.IsZero ||
                selected_graphics_queue_family_index == uint.MaxValue ||
                selected_present_queue_family_index == uint.MaxValue)
            {
                //std::cout << "Could not select physical device based on the chosen properties!" << std::endl;
                return;
            }

            var    queue_create_infos = stackalloc DeviceQueueCreateInfo[2];
            uint   count            = 1;
            float *queue_priorities = stackalloc float[1];

            queue_priorities[0] = 1.0f;

            queue_create_infos[0] = new DeviceQueueCreateInfo
            {
                sType            = StructureType.DeviceQueueCreateInfo,                  // VkStructureType              sType
                pNext            = IntPtr.Zero,                                          // const void                  *pNext
                flags            = 0,                                                    // VkDeviceQueueCreateFlagBits     flags
                queueFamilyIndex = selected_graphics_queue_family_index,                 // uint32_t                     queueFamilyIndex
                queueCount       = 1,                                                    // uint32_t                     queueCount
                pQueuePriorities = queue_priorities                                      // const float                 *pQueuePriorities
            };

            if (selected_graphics_queue_family_index != selected_present_queue_family_index)
            {
                queue_create_infos[1] = new DeviceQueueCreateInfo
                {
                    sType            = StructureType.DeviceQueueCreateInfo,                     // VkStructureType              sType
                    pNext            = IntPtr.Zero,                                             // const void                  *pNext
                    flags            = 0,                                                       // VkDeviceQueueCreateFlagBits     flags
                    queueFamilyIndex = selected_present_queue_family_index,                     // uint32_t                     queueFamilyIndex
                    queueCount       = 1,                                                       // uint32_t                     queueCount
                    pQueuePriorities = queue_priorities                                         // const float                 *pQueuePriorities
                };
                count++;
            }

            const uint exCount = 1;
            var        exPtr   = MarshalUtility.AllocateString(new string[] { KhrSwapchain.EXTENSION_NAME });

            DeviceCreateInfo device_create_info = new DeviceCreateInfo
            {
                sType = StructureType.DeviceCreateInfo,                        // VkStructureType                    sType
                pNext = IntPtr.Zero,                                           // const void                        *pNext
                flags = 0,                                                     // VkDeviceCreateFlagBits                flags
                queueCreateInfoCount    = count,                               // uint32_t                           queueCreateInfoCount
                pQueueCreateInfos       = queue_create_infos,                  // const VkDeviceQueueCreateInfo     *pQueueCreateInfos
                enabledLayerCount       = 0,                                   // uint32_t                           enabledLayerCount
                ppEnabledLayerNames     = (byte *)0,                           // const char * const                *ppEnabledLayerNames
                enabledExtensionCount   = exCount,                             // uint32_t                           enabledExtensionCount
                ppEnabledExtensionNames = (byte *)exPtr,                       // const char * const                *ppEnabledExtensionNames
                pEnabledFeatures        = (PhysicalDeviceFeatures *)0          // const VkPhysicalDeviceFeatures    *pEnabledFeatures
            };

            vk.CreateDevice(vulkan.PhysicalDevice, ref device_create_info, (AllocationCallbacks *)0, out vulkan.Device).CheckError();

            MarshalUtility.FreeString(exPtr, (int)exCount);
        }