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); }
public static bool CheckSwapchainCreateInfo(PhysicalDevice physicalDevice, SwapchainCreateInfoKhr createInfo, bool fixExtend) { SurfaceKhr surface = createInfo.Surface; foreach (uint index in createInfo.QueueFamilyIndices) { if (!physicalDevice.GetSurfaceSupportKHR(index, surface)) { return(false); } } bool supportImageFormat = false; foreach (SurfaceFormatKhr suportedFormat in physicalDevice.GetSurfaceFormatsKHR(surface)) { if (suportedFormat.Format == createInfo.ImageFormat && suportedFormat.ColorSpace == createInfo.ImageColorSpace) { supportImageFormat = true; break; } } if (!supportImageFormat) { return(false); } SurfaceCapabilitiesKhr capabilities = physicalDevice.GetSurfaceCapabilitiesKHR(surface); if (fixExtend) { var extend = createInfo.ImageExtent; extend.Width = Clamp(extend.Width, capabilities.MinImageExtent.Width, capabilities.MaxImageExtent.Width); extend.Height = Clamp(extend.Height, capabilities.MinImageExtent.Height, capabilities.MaxImageExtent.Height); createInfo.ImageExtent = extend; } if (createInfo.PreTransform == SurfaceTransformFlagsKhr.Inherit) { createInfo.PreTransform = capabilities.CurrentTransform; } // TODO: Fix up CompositeAlpha if Inherit is set if (capabilities.MinImageCount <= createInfo.MinImageCount && capabilities.MaxImageCount >= createInfo.MinImageCount && capabilities.MaxImageArrayLayers <= createInfo.ImageArrayLayers && ((capabilities.SupportedTransforms & createInfo.PreTransform) == createInfo.PreTransform) && ((capabilities.SupportedCompositeAlpha & createInfo.CompositeAlpha) == createInfo.CompositeAlpha) && ((capabilities.SupportedUsageFlags & createInfo.ImageUsage) == createInfo.ImageUsage) && createInfo.ImageExtent.Width >= capabilities.MinImageExtent.Width && createInfo.ImageExtent.Width <= capabilities.MaxImageExtent.Width && createInfo.ImageExtent.Height >= capabilities.MinImageExtent.Height && createInfo.ImageExtent.Height <= capabilities.MaxImageExtent.Height) { return(true); } return(false); }
private SurfaceFormatKhr SelectFormat(PhysicalDevice physicalDevice, SurfaceKhr surface) { foreach (var f in physicalDevice.GetSurfaceFormatsKHR(surface)) { if (f.Format == Format.R8g8b8a8Unorm || f.Format == Format.B8g8r8a8Unorm) { return(f); } } throw new Exception("didn't find the R8g8b8a8Unorm format"); }
protected SurfaceFormatKhr SelectFormat(PhysicalDevice physicalDevice, SurfaceKhr surface) { foreach (var f in physicalDevice.GetSurfaceFormatsKHR(surface)) { if (f.Format == Format.R8G8B8A8Unorm || f.Format == Format.B8G8R8A8Unorm) { return(f); } } throw new System.Exception("didn't find the R8G8B8A8Unorm or B8G8R8A8Unorm format"); }
public void Initialize(IWindow window) { CreateSurface(window); NodeIndex = PhysicalDevice.GetQueueFamilyPropertiesExt() .First(q => q.SupportsGraphics && q.Supports(Surface)) .QueueIndex; var surfaceFormats = PhysicalDevice.GetSurfaceFormatsKHR(Surface); if (surfaceFormats.Length == 1 && surfaceFormats.First().Format == Format.Undefined) ColorFormat = Format.B8G8R8A8Unorm; else ColorFormat = surfaceFormats.First().Format; ColorSpace = surfaceFormats.First().ColorSpace; }
private SurfaceFormatKhr SelectSurfaceFormat(PhysicalDevice physDev, SurfaceKhr surface) { foreach (var f in physDev.GetSurfaceFormatsKHR(surface)) { if (f.Format == Format.R8G8B8A8Unorm || f.Format == Format.B8G8R8A8Unorm) { return(f); } } throw new EngineException( "didn't find the R8G8B8A8Unorm or B8G8R8A8Unorm format", string.Empty ); }
private static SwapchainKhr GetSwapchain(PhysicalDevice physicalDevice, SurfaceKhr surface, Device device, SurfaceCapabilitiesKhr surfaceInfo) { var format = physicalDevice.GetSurfaceFormatsKHR(surface).First(); return(device.CreateSwapchainKHR(new SwapchainCreateInfoKhr { Surface = surface, MinImageCount = 2, ImageFormat = format.Format, ImageColorSpace = format.ColorSpace, ImageExtent = surfaceInfo.CurrentExtent, ImageArrayLayers = 1, ImageUsage = ImageUsageFlags.ColorAttachment | ImageUsageFlags.Sampled, ImageSharingMode = SharingMode.Exclusive, PreTransform = surfaceInfo.CurrentTransform, CompositeAlpha = CompositeAlphaFlagsKhr.Opaque, PresentMode = PresentModeKhr.Fifo, Clipped = true })); }
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 SurfaceFormatKhr[] GetSurfaceFormats(MySurface surface) { return(_physicalDevice.GetSurfaceFormatsKHR(surface.Handle)); }