示例#1
0
 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))
         });
     }
 }
示例#2
0
 internal static unsafe extern Result vkGetPhysicalDeviceSurfaceCapabilitiesKHR(PhysicalDevice physicalDevice, Surface surface, SurfaceCapabilities* surfaceCapabilities);
示例#3
0
        /// <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;
        }
示例#4
0
 public unsafe void GetSurfaceCapabilities(Surface surface, out SurfaceCapabilities surfaceCapabilities)
 {
     fixed (SurfaceCapabilities* __surfaceCapabilities__ = &surfaceCapabilities)
     {
         vkGetPhysicalDeviceSurfaceCapabilitiesKHR(this, surface, __surfaceCapabilities__).CheckError();
     }
 }