public SwapchainKHR(SurfaceKHR surface, Device device, uint minImageCount, uint layerCount, VkImageUsageFlag usageFlag, VkFormat imageFormat, VkColorSpaceKHR colorSpace, VkExtent2D dimensions, VkCompositeAlphaFlagBitsKHR compositeAlpha, VkPresentModeKHR presentMode, bool clipped = true, VkSurfaceTransformFlagBitsKHR transform = VkSurfaceTransformFlagBitsKHR.IdentityBitKhr, VkSharingMode sharing = VkSharingMode.Exclusive, uint[] sharedQueueFamily = null, SwapchainKHR oldSwapchain = null) { SurfaceKHR = surface; Device = device; { var surfSupported = false; foreach (var family in Device.Queues.Select(x => x.FamilyIndex).Distinct()) { if (PhysicalDevice.Handle.GetPhysicalDeviceSurfaceSupportKHR(family, SurfaceKHR.Handle)) { surfSupported = true; break; } } if (!surfSupported) { throw new NotSupportedException($"No queues on device support the surface"); } } _sharingQueueInfo = sharedQueueFamily; unsafe { if (sharing == VkSharingMode.Concurrent) { Debug.Assert(sharedQueueFamily != null); } var hasPinnedSharedQueue = sharedQueueFamily != null && sharedQueueFamily.Length > 0; var pinnedSharedQueueFamily = hasPinnedSharedQueue ? GCHandle.Alloc(sharedQueueFamily, GCHandleType.Pinned) : default(GCHandle); try { var info = new VkSwapchainCreateInfoKHR() { SType = VkStructureType.SwapchainCreateInfoKhr, PNext = IntPtr.Zero, Flags = 0, // reserved VkSwapchainCreateFlagBitsKHR Surface = surface.Handle, MinImageCount = minImageCount, ImageFormat = imageFormat, ImageColorSpace = colorSpace, ImageExtent = dimensions, ImageArrayLayers = layerCount, ImageUsage = usageFlag, ImageSharingMode = sharing, QueueFamilyIndexCount = (uint)(sharedQueueFamily?.Length ?? 0), PQueueFamilyIndices = hasPinnedSharedQueue ? (uint *)Marshal.UnsafeAddrOfPinnedArrayElement(sharedQueueFamily, 0).ToPointer() : (uint *)0, PreTransform = transform, CompositeAlpha = compositeAlpha, PresentMode = presentMode, Clipped = clipped, OldSwapchain = oldSwapchain?.Handle ?? VkSwapchainKHR.Null }; _info = info; Handle = Device.Handle.CreateSwapchainKHR(&info, Instance.AllocationCallbacks); if (oldSwapchain != null) { foreach (var img in oldSwapchain._swapchainImages) { img.Dispose(); } oldSwapchain.Dispose(); } } finally { if (hasPinnedSharedQueue) { pinnedSharedQueueFamily.Free(); } } } var images = Device.Handle.GetSwapchainImagesKHR(Handle); _swapchainImages.Clear(); _swapchainImages.Capacity = images.Length; foreach (var img in images) { _swapchainImages.Add(new SwapchainImage(this, img)); } }
public SwapchainKHRBuilder RequiredCompositeAlpha(VkCompositeAlphaFlagBitsKHR pref) { _requiredCompositeAlpha = pref; return(this); }