public void PresentKHR(SwapchainKHR swapchain, uint imageIndex, VkSemaphore[] waitSemaphores) { AssertValid(); unsafe { swapchain.AssertValid(); var swapHandle = swapchain.Handle; fixed(VkSemaphore *waitPtr = waitSemaphores) { var result = VkResult.ErrorDeviceLost; var info = new VkPresentInfoKHR() { SType = VkStructureType.PresentInfoKhr, PNext = IntPtr.Zero, SwapchainCount = 1, PSwapchains = &swapHandle, PImageIndices = &imageIndex, WaitSemaphoreCount = (uint)(waitSemaphores?.Length ?? 0), PWaitSemaphores = waitPtr, PResults = &result }; Handle.QueuePresentKHR(&info); VkException.Check(result); } } }
public void PresentKHR(SwapchainKHR swapchain, uint imageIndex, Semaphore[] semaphores) { PresentKHR(swapchain, imageIndex, semaphores?.Select(x => { x.AssertValid(); return(x.Handle); }).ToArray()); }
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)); } }