public unsafe CommandPool(QueueFamily queueFamily) { _queueFamily = queueFamily; _device = queueFamily.Device; var createInfo = new VkCommandPoolCreateInfo { sType = VkStructureType.CommandPoolCreateInfo, flags = VkCommandPoolCreateFlags.ResetCommandBuffer, queueFamilyIndex = queueFamily.Index }; VkCommandPool commandPool; if (VulkanNative.vkCreateCommandPool( queueFamily.Device.Handle, &createInfo, null, &commandPool ) != VkResult.Success) { throw new System.Exception("failed to create command pool on device"); } _handle = commandPool; }
public unsafe Swapchain(Device device, NativeWindow window) { _device = device; _window = window; //get present queue _presentQueueFamily = GetQueueFamilyWithPresentationSupport( device, window ); //get surface capabilities _surfaceCapabilities = GetSurfaceCapabilities( device, window ); //get surface format support _supportedSurfaceFormats = GetSupportedSurfaceFormats( device, window ); //get present mode support _supportedPresentModes = GetSupportedPresentModes( device, window ); //choose best surface format #region Surface Format if ( _supportedSurfaceFormats.Count == 1 && _supportedSurfaceFormats[0].format == VkFormat.Undefined ) { _surfaceFormat = new VkSurfaceFormatKHR { colorSpace = VkColorSpaceKHR.SrgbNonlinearKHR, format = VkFormat.R8g8b8Unorm }; } else { bool choosenFormat = false; foreach (var format in _supportedSurfaceFormats) { if ( format.format == VkFormat.R8g8b8Unorm && format.colorSpace == VkColorSpaceKHR.SrgbNonlinearKHR ) { _surfaceFormat = format; choosenFormat = true; break; } } if (choosenFormat == false) { _surfaceFormat = _supportedSurfaceFormats[0]; } } #endregion #region Surface Present Mode _surfacePresentMode = VkPresentModeKHR.FifoKHR; foreach (var presentMode in _supportedPresentModes) { if (presentMode == VkPresentModeKHR.MailboxKHR) { _surfacePresentMode = presentMode; break; } else if (presentMode == VkPresentModeKHR.ImmediateKHR) { _surfacePresentMode = presentMode; } } #endregion #region Surface Extent if (_surfaceCapabilities.currentExtent.width != uint.MaxValue) { _surfaceExtent = _surfaceCapabilities.currentExtent; } else { _surfaceExtent = new VkExtent2D { width = Math.Clamp( Convert.ToUInt32(window.Width), _surfaceCapabilities.minImageExtent.width, _surfaceCapabilities.maxImageExtent.width ), height = Math.Clamp( Convert.ToUInt32(window.Height), _surfaceCapabilities.minImageExtent.height, _surfaceCapabilities.maxImageExtent.height ) }; } #endregion #region Images Count var imagesCount = _surfaceCapabilities.minImageCount + 1; if (_surfaceCapabilities.maxImageCount > 0) { if (imagesCount > _surfaceCapabilities.maxImageCount) { imagesCount = Math.Min(_surfaceCapabilities.maxImageCount, 2); } } #endregion var queueFamilyIndices = new NativeList <uint>(); foreach (var queueFamily in device.QueueFamilies) { queueFamilyIndices.Add(queueFamily.Index); } var swapchainInfo = new VkSwapchainCreateInfoKHR { sType = VkStructureType.SwapchainCreateInfoKHR, compositeAlpha = VkCompositeAlphaFlagsKHR.OpaqueKHR, minImageCount = imagesCount, imageFormat = _surfaceFormat.format, imageColorSpace = _surfaceFormat.colorSpace, imageExtent = _surfaceExtent, imageArrayLayers = 1, imageUsage = ( VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.TransferDst ), imageSharingMode = VkSharingMode.Concurrent, preTransform = _surfaceCapabilities.currentTransform, presentMode = _surfacePresentMode, surface = window.Surface, clipped = true, queueFamilyIndexCount = queueFamilyIndices.Count, pQueueFamilyIndices = (uint *)queueFamilyIndices.Data.ToPointer() }; VkSwapchainKHR swapchain; if (VulkanNative.vkCreateSwapchainKHR( device.Handle, &swapchainInfo, null, &swapchain ) != VkResult.Success) { throw new Exception("failed to create swapchain"); } _handle = swapchain; SetupSwapchainImages(); }