public SurfaceCapabilitiesKHR
 (
     uint minImageCount       = default,
     uint maxImageCount       = default,
     Extent2D currentExtent   = default,
     Extent2D minImageExtent  = default,
     Extent2D maxImageExtent  = default,
     uint maxImageArrayLayers = default,
     SurfaceTransformFlagsKHR supportedTransforms   = default,
     SurfaceTransformFlagsKHR currentTransform      = default,
     CompositeAlphaFlagsKHR supportedCompositeAlpha = default,
     ImageUsageFlags supportedUsageFlags            = default
 )
 {
     MinImageCount           = minImageCount;
     MaxImageCount           = maxImageCount;
     CurrentExtent           = currentExtent;
     MinImageExtent          = minImageExtent;
     MaxImageExtent          = maxImageExtent;
     MaxImageArrayLayers     = maxImageArrayLayers;
     SupportedTransforms     = supportedTransforms;
     CurrentTransform        = currentTransform;
     SupportedCompositeAlpha = supportedCompositeAlpha;
     SupportedUsageFlags     = supportedUsageFlags;
 }
 public SurfaceCapabilities2EXT
 (
     StructureType sType      = StructureType.SurfaceCapabilities2Ext,
     void *pNext              = default,
     uint minImageCount       = default,
     uint maxImageCount       = default,
     Extent2D currentExtent   = default,
     Extent2D minImageExtent  = default,
     Extent2D maxImageExtent  = default,
     uint maxImageArrayLayers = default,
     SurfaceTransformFlagsKHR supportedTransforms    = default,
     SurfaceTransformFlagsKHR currentTransform       = default,
     CompositeAlphaFlagsKHR supportedCompositeAlpha  = default,
     ImageUsageFlags supportedUsageFlags             = default,
     SurfaceCounterFlagsEXT supportedSurfaceCounters = default
 )
 {
     SType                    = sType;
     PNext                    = pNext;
     MinImageCount            = minImageCount;
     MaxImageCount            = maxImageCount;
     CurrentExtent            = currentExtent;
     MinImageExtent           = minImageExtent;
     MaxImageExtent           = maxImageExtent;
     MaxImageArrayLayers      = maxImageArrayLayers;
     SupportedTransforms      = supportedTransforms;
     CurrentTransform         = currentTransform;
     SupportedCompositeAlpha  = supportedCompositeAlpha;
     SupportedUsageFlags      = supportedUsageFlags;
     SupportedSurfaceCounters = supportedSurfaceCounters;
 }
Beispiel #3
0
 public SwapchainCreateInfoKHR
 (
     StructureType sType                   = StructureType.SwapchainCreateInfoKhr,
     void *pNext                           = default,
     SwapchainCreateFlagsKHR flags         = default,
     SurfaceKHR surface                    = default,
     uint minImageCount                    = default,
     Format imageFormat                    = default,
     ColorSpaceKHR imageColorSpace         = default,
     Extent2D imageExtent                  = default,
     uint imageArrayLayers                 = default,
     ImageUsageFlags imageUsage            = default,
     SharingMode imageSharingMode          = default,
     uint queueFamilyIndexCount            = default,
     uint *pQueueFamilyIndices             = default,
     SurfaceTransformFlagsKHR preTransform = default,
     CompositeAlphaFlagsKHR compositeAlpha = default,
     PresentModeKHR presentMode            = default,
     Bool32 clipped                        = default,
     SwapchainKHR oldSwapchain             = default
 )
 {
     SType                 = sType;
     PNext                 = pNext;
     Flags                 = flags;
     Surface               = surface;
     MinImageCount         = minImageCount;
     ImageFormat           = imageFormat;
     ImageColorSpace       = imageColorSpace;
     ImageExtent           = imageExtent;
     ImageArrayLayers      = imageArrayLayers;
     ImageUsage            = imageUsage;
     ImageSharingMode      = imageSharingMode;
     QueueFamilyIndexCount = queueFamilyIndexCount;
     PQueueFamilyIndices   = pQueueFamilyIndices;
     PreTransform          = preTransform;
     CompositeAlpha        = compositeAlpha;
     PresentMode           = presentMode;
     Clipped               = clipped;
     OldSwapchain          = oldSwapchain;
 }
Beispiel #4
0
            public _SwapchainCreateInfoKHR(SwapchainCreateInfoKHR info)
            {
                SType                 = info.type;
                Next                  = info.next;
                Flags                 = info.flags;
                Surface               = info.surface;
                MinImageCount         = info.minImageCount;
                ImageFormat           = info.imageFormat;
                ImageColorSpace       = info.imageColorSpace;
                ImageExtent           = info.imageExtent;
                ImageArrayLayers      = info.imageArrayLayers;
                ImageUsage            = info.imageUsage;
                ImageSharingMode      = info.imageSharingMode;
                QueueFamilyIndexCount = (UInt32)(info.queueFamilyIndices?.Count ?? 0);
                QueueFamilyIndices    = info.queueFamilyIndices != null?Alloc.alloc(info.queueFamilyIndices) : IntPtr.Zero;

                PreTransform   = info.preTransform;
                CompositeAlpha = info.compositeAlpha;
                PresentMode    = info.presentMode;
                Clipped        = info.clipped;
                OldSwapchain   = info.oldSwapchain;
            }
Beispiel #5
0
 /// <param name="Surface">The swapchain's target surface</param>
 /// <param name="MinImageCount">Minimum number of presentation images the application needs</param>
 /// <param name="ImageFormat">Format of the presentation images</param>
 /// <param name="ImageColorSpace">Colorspace of the presentation images</param>
 /// <param name="ImageExtent">Dimensions of the presentation images</param>
 /// <param name="ImageArrayLayers">Determines the number of views for multiview/stereo presentation</param>
 /// <param name="ImageUsage">Bits indicating how the presentation images will be used</param>
 /// <param name="ImageSharingMode">Sharing mode used for the presentation images</param>
 /// <param name="QueueFamilyIndices">Array of queue family indices having access to the images in case of concurrent sharing mode</param>
 /// <param name="PreTransform">The transform, relative to the device's natural orientation, applied to the image content prior to presentation</param>
 /// <param name="CompositeAlpha">The alpha blending mode used when compositing this surface with other surfaces in the window system</param>
 /// <param name="PresentMode">Which presentation mode to use for presents on this swap chain</param>
 /// <param name="Clipped">Specifies whether presentable images may be affected by window clip regions</param>
 public SwapchainCreateInfoKHR(SurfaceKHR Surface, UInt32 MinImageCount, Format ImageFormat, ColorSpaceKHR ImageColorSpace, Extent2D ImageExtent, UInt32 ImageArrayLayers, ImageUsageFlags ImageUsage, SharingMode ImageSharingMode, UInt32[] QueueFamilyIndices, SurfaceTransformFlagsKHR PreTransform, CompositeAlphaFlagsKHR CompositeAlpha, PresentModeKHR PresentMode, Bool32 Clipped) : this()
 {
     this.Surface            = Surface;
     this.MinImageCount      = MinImageCount;
     this.ImageFormat        = ImageFormat;
     this.ImageColorSpace    = ImageColorSpace;
     this.ImageExtent        = ImageExtent;
     this.ImageArrayLayers   = ImageArrayLayers;
     this.ImageUsage         = ImageUsage;
     this.ImageSharingMode   = ImageSharingMode;
     this.QueueFamilyIndices = QueueFamilyIndices;
     this.PreTransform       = PreTransform;
     this.CompositeAlpha     = CompositeAlpha;
     this.PresentMode        = PresentMode;
     this.Clipped            = Clipped;
 }
Beispiel #6
0
        private static unsafe SwapchainKHR CreateSwapchain(VulkanInstance instance, VulkanDevice device,
                                                           VulkanPhysicalDevice physicalDevice, VulkanSurface surface, out Extent2D swapchainExtent,
                                                           SwapchainKHR?oldswapchain = null, bool vsyncEnabled = true)
        {
            if (_swapchainExtension == null)
            {
                instance.Api.TryGetDeviceExtension(instance.InternalHandle, device.InternalHandle, out _swapchainExtension);
            }

            while (!surface.CanSurfacePresent(physicalDevice))
            {
                Thread.Sleep(16);
            }

            VulkanSurface.SurfaceExtension.GetPhysicalDeviceSurfaceCapabilities(physicalDevice.InternalHandle,
                                                                                surface.ApiHandle, out var capabilities);

            var imageCount = capabilities.MinImageCount + 1;

            if (capabilities.MaxImageCount > 0 && imageCount > capabilities.MaxImageCount)
            {
                imageCount = capabilities.MaxImageCount;
            }

            var surfaceFormat = surface.GetSurfaceFormat(physicalDevice);

            bool supportsIdentityTransform = capabilities.SupportedTransforms.HasFlag(SurfaceTransformFlagsKHR.SurfaceTransformIdentityBitKhr);
            bool isRotated = capabilities.CurrentTransform.HasFlag(SurfaceTransformFlagsKHR.SurfaceTransformRotate90BitKhr) ||
                             capabilities.CurrentTransform.HasFlag(SurfaceTransformFlagsKHR.SurfaceTransformRotate270BitKhr);

            swapchainExtent = GetSwapchainExtent(surface, capabilities);

            CompositeAlphaFlagsKHR compositeAlphaFlags = GetSuitableCompositeAlphaFlags(capabilities);

            PresentModeKHR presentMode = GetSuitablePresentMode(physicalDevice, surface, vsyncEnabled);

            var swapchainCreateInfo = new SwapchainCreateInfoKHR
            {
                SType           = StructureType.SwapchainCreateInfoKhr,
                Surface         = surface.ApiHandle,
                MinImageCount   = imageCount,
                ImageFormat     = surfaceFormat.Format,
                ImageColorSpace = surfaceFormat.ColorSpace,
                ImageExtent     = swapchainExtent,
                ImageUsage      =
                    ImageUsageFlags.ImageUsageColorAttachmentBit | ImageUsageFlags.ImageUsageTransferDstBit,
                ImageSharingMode = SharingMode.Exclusive,
                ImageArrayLayers = 1,
                PreTransform     = supportsIdentityTransform && isRotated ?
                                   SurfaceTransformFlagsKHR.SurfaceTransformIdentityBitKhr :
                                   capabilities.CurrentTransform,
                CompositeAlpha = compositeAlphaFlags,
                PresentMode    = presentMode,
                Clipped        = true,
                OldSwapchain   = oldswapchain ?? new SwapchainKHR()
            };

            _swapchainExtension.CreateSwapchain(device.InternalHandle, swapchainCreateInfo, null, out var swapchain)
            .ThrowOnError();

            if (oldswapchain != null)
            {
                _swapchainExtension.DestroySwapchain(device.InternalHandle, oldswapchain.Value, null);
            }

            return(swapchain);
        }