internal void CacheSwapchainImages() { if (SwapchainImages != null) { foreach (var img in SwapchainImages) { img.DisposeExceptImages(); } } var imgs = Swapchain.GetImages(); SwapchainImages = new VKImage[imgs.Length]; for (var i = 0; i < imgs.Length; i++) { SwapchainImages[i] = new VKImage(this, imgs[i], Swapchain.Format, Window.FrameBufferSize); SwapchainImages[i].CreateDepthStencil(); } }
private void CreateSwapchain(int swapchainCount) { SurfaceCapabilitiesKhr capabilities = hostDevice.GetCurrentCapabilities(surface); //Clamp the size to within the min and max extends reported by the surface capabilities swapchainSize = nativeWindow.ClientRect.Size.Clamp( new Int2(capabilities.MinImageExtent.Width, capabilities.MinImageExtent.Height), new Int2(capabilities.MaxImageExtent.Width, capabilities.MaxImageExtent.Height)); //Gather info about the swapchain var createInfo = new SwapchainCreateInfoKhr ( surface: surface, minImageCount: swapchainCount, imageFormat: surfaceFormat, imageColorSpace: surfaceColorspace, imageExtent: new Extent2D(swapchainSize.X, swapchainSize.Y), imageArrayLayers: 1, imageUsage: ImageUsages.ColorAttachment, //If the graphics and present queues are different we need to allow sharing the //swapchain images imageSharingMode: graphicsQueue.FamilyIndex == presentQueue.FamilyIndex ? SharingMode.Exclusive : SharingMode.Concurrent, queueFamilyIndices: graphicsQueue.FamilyIndex == presentQueue.FamilyIndex ? null : new [] { graphicsQueue.FamilyIndex, presentQueue.FamilyIndex }, preTransform: capabilities.CurrentTransform, compositeAlpha: CompositeAlphasKhr.Opaque, presentMode: presentMode, clipped: true ); //Create the swapchain swapchain = logicalDevice.CreateSwapchainKhr(createInfo); var swapchainImages = swapchain.GetImages(); //Verify that we got the amount of images we expected if (swapchainImages.Length != swapchainCount) { throw new Exception( $"[{nameof(Window)}] Incorrect number of swapchain images acquired, expected: {swapchainCount}, got: {swapchainImages.Length}"); } //Create the image targets swapchainTextures = new DeviceTexture[swapchainCount]; for (int i = 0; i < swapchainTextures.Length; i++) { swapchainTextures[i] = DeviceTexture.CreateSwapchainTarget( swapchainSize, surfaceFormat, swapchainImages[i]); } logger?.Log(nameof(Window), $@"Swapchain created: {{ size: {swapchainSize}, texCount: {swapchainTextures.Length}, mode: {presentMode}, format: {surfaceFormat}, colorSpace: {surfaceColorspace} }}"); }
public bool CreateSwapChain(DrunkSpock spock, int extentX, int extentY) { PhysicalDevice phys = mLogical.Parent; SurfaceKhr surf = spock.GetSurface(); SurfaceCapabilitiesKhr surfCaps = phys.GetSurfaceCapabilitiesKhr(surf); SurfaceFormatKhr [] surfFormats = phys.GetSurfaceFormatsKhr(surf); PresentModeKhr [] presModes = phys.GetSurfacePresentModesKhr(surf); if (surfFormats.Length <= 0 || presModes.Length <= 0) { Misc.SafeInvoke(eErrorSpam, "Bad formats or pres modes..."); return(false); } mSwapExtent = new Extent2D(extentX, extentY); int imageCount = surfCaps.MinImageCount + 1; if (surfCaps.MaxImageCount > 0 && imageCount > surfCaps.MaxImageCount) { imageCount = surfCaps.MaxImageCount; } SwapchainCreateInfoKhr scci = new SwapchainCreateInfoKhr( surf, Format.B8G8R8A8UNorm, mSwapExtent, imageCount, ColorSpaceKhr.SRgbNonlinear, 1, ImageUsages.ColorAttachment); scci.ImageSharingMode = SharingMode.Exclusive; if (presModes.Contains(PresentModeKhr.Mailbox)) { scci.PresentMode = PresentModeKhr.Mailbox; } mSwapChain = mLogical.CreateSwapchainKhr(scci); if (mSwapChain == null) { Misc.SafeInvoke(eErrorSpam, "Create swap chain failed..."); return(false); } VulkanCore.Image [] chainImages = mSwapChain.GetImages(); mChainImageViews = new ImageView[chainImages.Length]; for (int i = 0; i < chainImages.Length; i++) { ImageSubresourceRange isr = new ImageSubresourceRange( ImageAspects.Color, 0, 1, 0, 1); ImageViewCreateInfo ivci = new ImageViewCreateInfo( mSwapChain.Format, isr); mChainImageViews[i] = chainImages[i].CreateView(ivci); } //descriptor pool stuff DescriptorPoolSize dps = new DescriptorPoolSize( DescriptorType.UniformBuffer, chainImages.Length); DescriptorPoolCreateInfo dpci = new DescriptorPoolCreateInfo(); dpci.PoolSizes = new DescriptorPoolSize[] { dps }; dpci.MaxSets = chainImages.Length; mDPool = mLogical.CreateDescriptorPool(dpci); return(true); }