public Extent2D ChooseSwapExtent(SurfaceCapabilities capabilities) { if (capabilities.CurrentExtent.Width != uint.MaxValue) { return(capabilities.CurrentExtent); } else { return(new Extent2D { Width = Math.Max(capabilities.MinImageExtent.Width, Math.Min(capabilities.MaxImageExtent.Width, SurfaceWidth)), Height = Math.Max(capabilities.MinImageExtent.Height, Math.Min(capabilities.MaxImageExtent.Height, SurfaceHeight)) }); } }
internal static unsafe extern Result vkGetPhysicalDeviceSurfaceCapabilitiesKHR(PhysicalDevice physicalDevice, Surface surface, SurfaceCapabilities* surfaceCapabilities);
/// <summary> /// Initialize this swap chain on a specified surface. /// </summary> /// <param name="surface">Target video surface.</param> /// <param name="surfaceSize">Swap queue target size.</param> public void Initialize(Surface surface, Vector2i surfaceSize) { base.Initialize(surface, surfaceSize); VKSurface vkSurface = surface as VKSurface; // - Get capabilites and hardware information SurfaceCapabilities Capabilities = GraphicsCard.Handle.GetSurfaceCapabilities(vkSurface.Handle); formats = GraphicsCard.Handle.GetSurfaceFormats(vkSurface.Handle); presentModes = GraphicsCard.Handle.GetSurfacePresentModes(vkSurface.Handle); uint imageCount = Capabilities.MinImageCount + 1; if (Capabilities.MaxImageCount > 0 && imageCount > Capabilities.MaxImageCount) { imageCount = Capabilities.MaxImageCount; } // - Default video format -> the first one surfaceFormat = formats[0]; // - Checks for a BGRA32 video format foreach (var format in formats) { if (format.Format == Format.B8G8R8A8UNorm && format.ColorSpace == ColorSpace.SrgbNonlinear) { surfaceFormat = format; break; } } // - Checks if ther're no avaiable formats and we create a new one if (formats.Length == 1 && formats[0].Format == Format.Undefined) { surfaceFormat = new SharpVk.Khronos.SurfaceFormat { Format = Format.B8G8R8A8UNorm, ColorSpace = ColorSpace.SrgbNonlinear }; } // - Computes the swap chain drawing surface size Extent2D extent = Capabilities.CurrentExtent; if (extent.Width != uint.MaxValue) { long Width = Math.Max(Capabilities.MinImageExtent.Width, Math.Min(Capabilities.MaxImageExtent.Width, surfaceSize.Width)); long Height = Math.Max(Capabilities.MinImageExtent.Height, Math.Min(Capabilities.MaxImageExtent.Height, surfaceSize.Height)); extent = new Extent2D((uint)Width, (uint)Height); } // - Shortcut (to avoid long parameters on the next call) var queues = new[] { RenderDevice.PresentQueueIndex, RenderDevice.GraphicQueueIndex }; bool exclusive = RenderDevice.GraphicQueueIndex == RenderDevice.PresentQueueIndex; Handle = RenderDevice.Handle.CreateSwapchain ( vkSurface.Handle, imageCount, surfaceFormat.Format, surfaceFormat.ColorSpace, extent, 1, ImageUsageFlags.ColorAttachment, exclusive ? SharingMode.Exclusive : SharingMode.Concurrent, exclusive ? null : queues, Capabilities.CurrentTransform, CompositeAlphaFlags.Opaque, PresentModes.Contains(PresentMode.Mailbox) ? PresentMode.Mailbox : PresentMode.Fifo, true, Handle ); images = Handle.GetImages(); this.extent = extent; }
public unsafe void GetSurfaceCapabilities(Surface surface, out SurfaceCapabilities surfaceCapabilities) { fixed (SurfaceCapabilities* __surfaceCapabilities__ = &surfaceCapabilities) { vkGetPhysicalDeviceSurfaceCapabilitiesKHR(this, surface, __surfaceCapabilities__).CheckError(); } }