Ejemplo n.º 1
0
        public unsafe void Dispose()
        {
            if (debugReportCallback != VkDebugUtilsMessengerEXT.Null)
            {
                vkDestroyDebugUtilsMessengerEXT(NativeInstance, debugReportCallback, null);
                debugReportCallback = VkDebugUtilsMessengerEXT.Null;
            }

            vkDestroyInstance(NativeInstance, null);
        }
Ejemplo n.º 2
0
 public static void vkDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT messenger, VkAllocationCallbacks *pAllocator)
 => vkDestroyDebugUtilsMessengerEXT_ptr(instance, messenger, pAllocator);
Ejemplo n.º 3
0
        protected override void FirstWindowCreated()
        {
            VK = new VK(this);

            // Debug Callback
            if (HasValidationLayers)
            {
                DebugMessenger = CreateDebugMessenger((messageSeverity, messageTypes, pCallbackData, pUserData) =>
                {
                    var message = VK.STRING(pCallbackData->pMessage);

                    if (messageSeverity.HasFlag(VkDebugUtilsMessageSeverityFlagsEXT.Error))
                    {
                        Log.Error(Name, message);
                    }
                    else if (messageSeverity.HasFlag(VkDebugUtilsMessageSeverityFlagsEXT.Warning))
                    {
                        Log.Warning(Name, message);
                    }
                    else
                    {
                        Log.Message(Name, message);
                    }

                    return(VkConst.FALSE);
                });
            }

            // Pick a Physical Device
            PhysicalDevice = PickPhysicalDevice();

            // get the API version
            {
                VkPhysicalDeviceProperties properties;
                VK.GetPhysicalDeviceProperties(PhysicalDevice, &properties);
                ApiVersion = VK.UNMAKE_VERSION(properties.apiVersion);

                int length = 0;
                while (length < VkConst.MAX_PHYSICAL_DEVICE_NAME_SIZE && properties.deviceName[length] != 0)
                {
                    length++;
                }
                DeviceName = Encoding.UTF8.GetString(properties.deviceName, length);
            }

            // Create the Device
            {
                TryGetQueueFamilyIndex(PhysicalDevice, VkQueueFlags.GraphicsBit, out uint graphicsFamilyIndex);

                // Graphics Family Queue
                var priority        = 1.0f;
                var queueCreateInfo = new VkDeviceQueueCreateInfo
                {
                    sType            = VkStructureType.DeviceQueueCreateInfo,
                    queueFamilyIndex = graphicsFamilyIndex,
                    queueCount       = 1,
                    pQueuePriorities = &priority
                };

                // Device Features
                var deviceFeatures = new VkPhysicalDeviceFeatures();

                var createInfo = new VkDeviceCreateInfo
                {
                    sType                = VkStructureType.DeviceCreateInfo,
                    pQueueCreateInfos    = &queueCreateInfo,
                    queueCreateInfoCount = 1,
                    pEnabledFeatures     = &deviceFeatures,
                };

                // Device Extensions
                using var deviceExtensionNames     = new NativeStringArray(deviceExtensions);
                createInfo.enabledExtensionCount   = deviceExtensionNames.Length;
                createInfo.ppEnabledExtensionNames = deviceExtensionNames;

                var result = VK.CreateDevice(PhysicalDevice, &createInfo, null, out Device);
                if (result != VkResult.Success)
                {
                    throw new Exception($"Failed to create Vulkan Logical Device, {result}");
                }

                // Get the Graphics Queue
                VK.GetDeviceQueue(Device, graphicsFamilyIndex, 0, out GraphicsQueue);
            }
        }