protected SwapchainData CreateSwapchain(PhysicalDevice physicalDevice, SurfaceKHR surface, uint windowWidth, uint windowHeight) { var data = new SwapchainData(); var surfaceFormats = physicalDevice.GetSurfaceFormatsKHR(surface); var surfaceFormat = surfaceFormats[0].Format; var surfaceCapabilities = physicalDevice.GetSurfaceCapabilitiesKHR(surface); var desiredImageCount = Math.Min(surfaceCapabilities.MinImageCount + 1, surfaceCapabilities.MaxImageCount); SurfaceTransformFlagsKHR preTransform; if ((surfaceCapabilities.SupportedTransforms & SurfaceTransformFlagsKHR.Identity) != 0) { preTransform = SurfaceTransformFlagsKHR.Identity; } else { preTransform = surfaceCapabilities.CurrentTransform; } var presentModes = physicalDevice.GetSurfacePresentModesKHR(surface); var swapChainPresentMode = PresentModeKHR.Fifo; if (presentModes.Contains(PresentModeKHR.Mailbox)) { swapChainPresentMode = PresentModeKHR.Mailbox; } else if (presentModes.Contains(PresentModeKHR.Immediate)) { swapChainPresentMode = PresentModeKHR.Immediate; } var imageExtent = new Extent2D(windowWidth, windowHeight); var swapchainCreateInfo = new SwapchainCreateInfoKHR { Surface = surface, MinImageCount = desiredImageCount, ImageFormat = surfaceFormat, ImageExtent = imageExtent, ImageArrayLayers = 1, ImageUsage = ImageUsageFlags.ColorAttachment, ImageSharingMode = SharingMode.Exclusive, //ImageColorSpace = ColorSpaceKHR.SrgbNonlinear, QueueFamilyIndices = null, PreTransform = preTransform, CompositeAlpha = CompositeAlphaFlagsKHR.Opaque, PresentMode = swapChainPresentMode, Clipped = true, }; data.Swapchain = device.CreateSwapchainKHR(swapchainCreateInfo); data.ImageFormat = surfaceFormat; return(data); }
void ReportModes(PhysicalDevice device) { var modes = device.GetSurfacePresentModesKHR(Surface); if (modes == null) { return; } AppendText(string.Format("\n\tSurface Present modes\n")); foreach (var mode in modes) { AppendText(string.Format("\t\tMode: {0}\n", mode)); } }
public SwapChainSupportDetails(PhysicalDevice device, SurfaceKhr surface) { capabilities = device.GetSurfaceCapabilitiesKHR(surface); formats = device.GetSurfaceFormatsKHR(surface); presentModes = device.GetSurfacePresentModesKHR(surface); }
static void CreateSwapchain() { // surface format var surfaceFormats = physicalDevice.GetSurfaceFormatsKHR(surface); if (surfaceFormats.Count == 1 && surfaceFormats[0].Format == Format.Undefined) { backBufferFormat = Format.B8g8r8a8Unorm; Console.WriteLine($"using default backBufferFormat {backBufferFormat}"); } else { backBufferFormat = surfaceFormats[0].Format; Console.WriteLine($"backBufferFormat {backBufferFormat}"); } var surfaceCapabilities = physicalDevice.GetSurfaceCapabilitiesKHR(surface); // Buffer count var desiredImageCount = surfaceCapabilities.MinImageCount + 1; if (surfaceCapabilities.MaxImageCount > 0 && desiredImageCount > surfaceCapabilities.MaxImageCount) { desiredImageCount = surfaceCapabilities.MaxImageCount; } // Transform SurfaceTransformFlagsKhr preTransform; if ((surfaceCapabilities.SupportedTransforms & SurfaceTransformFlagsKhr.Identity) != 0) { preTransform = SurfaceTransformFlagsKhr.Identity; } else { preTransform = surfaceCapabilities.CurrentTransform; } // Present mode var presentModes = physicalDevice.GetSurfacePresentModesKHR(surface); var swapChainPresentMode = PresentModeKhr.Fifo; if (presentModes.Contains(PresentModeKhr.Mailbox)) { swapChainPresentMode = PresentModeKhr.Mailbox; } else if (presentModes.Contains(PresentModeKhr.Immediate)) { swapChainPresentMode = PresentModeKhr.Immediate; } Console.WriteLine($"swapChainPresentMode {swapChainPresentMode}"); // Create swapchain /*var swapchainCreateInfo = new SwapchainCreateInfoKhr * { * Surface = surface, * ImageSharingMode = SharingMode.Exclusive, * ImageExtent = new Extent2D { Width = 800, Height = 600 }, * ImageArrayLayers = 1, * ImageFormat = backBufferFormat, * ImageColorSpace = ColorSpaceKhr.SrgbNonlinear, * ImageUsage = (uint)ImageUsageFlags.ColorAttachment, * PresentMode = swapChainPresentMode, * CompositeAlpha = CompositeAlphaFlagsKhr.Opaque, * MinImageCount = desiredImageCount, * PreTransform = preTransform, * Clipped = true, * }; * swapchain = device.CreateSwapchainKHR(swapchainCreateInfo, null); * Console.WriteLine("[ OK ] Swapchain"); * * backBuffers = device.GetSwapchainImagesKHR(swapchain);*/ }
private (SurfaceCapabilitiesKhr surfaceCapablities, SurfaceFormatKhr[] formats, PresentModeKhr[] presentModes) QuerySwapchainSupport(PhysicalDevice device) { return(device.GetSurfaceCapabilitiesKHR(data.surface), device.GetSurfaceFormatsKHR(data.surface), device.GetSurfacePresentModesKHR(data.surface)); }
public void Create(CommandBuffer commandBuffer) { var surfaceCapabilities = PhysicalDevice.GetSurfaceCapabilitiesKHR(Surface); Extent2D swapChainExtend = new Extent2D { Width = surfaceCapabilities.CurrentExtent.Width, Height = surfaceCapabilities.CurrentExtent.Height }; var presentModes = PhysicalDevice.GetSurfacePresentModesKHR(Surface); PresentModeKhr presentMode = GetBestPresentMode(presentModes); var desiredImages = surfaceCapabilities.MinImageCount + 1; if (surfaceCapabilities.MaxImageCount > 0 && desiredImages > surfaceCapabilities.MaxImageCount) { desiredImages = surfaceCapabilities.MaxImageCount; } var preTransform = surfaceCapabilities.CurrentTransform; if (surfaceCapabilities.SupportedTransforms.HasFlag(SurfaceTransformFlagsKhr.Identity)) { preTransform = SurfaceTransformFlagsKhr.Identity; } var oldSwapChain = Swapchain; var swapChainCreateInfo = new SwapchainCreateInfoKhr { Surface = Surface, MinImageCount = desiredImages, ImageFormat = ColorFormat, ImageColorSpace = ColorSpace, ImageExtent = swapChainExtend, ImageUsage = ImageUsageFlags.ColorAttachment, PreTransform = preTransform, ImageArrayLayers = 1, ImageSharingMode = SharingMode.Exclusive, QueueFamilyIndexCount = 0, QueueFamilyIndices = null, PresentMode = presentMode, Clipped = true, // Alpha on the window surface should be opaque: // If it was not we could create transparent regions of our window which // would require support from the Window compositor. You can totally do // that if you wanted though ;) CompositeAlpha = CompositeAlphaFlagsKhr.Opaque }; Swapchain = Device.CreateSwapchainKHR(swapChainCreateInfo); if (oldSwapChain != null) { Device.DestroySwapchainKHR(oldSwapChain); } Images = Device.GetSwapchainImagesKHR(Swapchain).ToList(); // Create the image views for the swap chain. They will all be single // layer, 2D images, with no mipmaps. // Check the VkImageViewCreateInfo structure to see other views you // can potentially create. for (var i = 0; i < Images.Count; i++) { var buffer = new SwapChainBuffer(); var colorAttachmentView = new ImageViewCreateInfo { Format = ColorFormat, Components = new ComponentMapping { R = ComponentSwizzle.R, G = ComponentSwizzle.G, B = ComponentSwizzle.B, A = ComponentSwizzle.A }, SubresourceRange = new ImageSubresourceRange { AspectMask = ImageAspectFlags.Color, BaseMipLevel = 0, LevelCount = 1, BaseArrayLayer = 0, LayerCount = 1 }, ViewType = ImageViewType.View2D }; buffer.Image = Images[i]; SetImageLayout(commandBuffer, buffer.Image, ImageAspectFlags.Color, ImageLayout.Undefined, ImageLayout.PresentSrcKhr); buffer.View = Device.CreateImageView(colorAttachmentView); Buffers.Add(buffer); } }