private unsafe void CreateDepthBuffer() { var depthInfo = new ImageCreateInfo { SType = StructureType.ImageCreateInfo, ImageType = ImageType.ImageType2D, Format = DepthFormat, Extent = new Extent3D(this.SwapchainExtent.Width, this.SwapchainExtent.Height, 1), MipLevels = 1, ArrayLayers = 1, Samples = SampleCountFlags.SampleCount1Bit, InitialLayout = ImageLayout.Undefined, Usage = ImageUsageFlags.ImageUsageDepthStencilAttachmentBit, SharingMode = SharingMode.Exclusive }; var depthViewInfo = new ImageViewCreateInfo { SType = StructureType.ImageViewCreateInfo, Format = DepthFormat, Components = new ComponentMapping(ComponentSwizzle.R, ComponentSwizzle.G, ComponentSwizzle.B, ComponentSwizzle.A), SubresourceRange = new ImageSubresourceRange(aspectMask: ImageAspectFlags.ImageAspectDepthBit, levelCount: 1, layerCount: 1), ViewType = ImageViewType.ImageViewType2D }; var allocInfo = new AllocationCreateInfo(usage: MemoryUsage.GPU_Only); var image = this.Allocator.CreateImage(depthInfo, allocInfo, out Allocation alloc); depthViewInfo.Image = image; ImageView view; var res = VkApi.CreateImageView(this.Device, &depthViewInfo, null, &view); if (res != Result.Success) { throw new Exception("Unable to create depth image view!"); } this.DepthBuffer.Image = image; this.DepthBuffer.View = view; this.DepthBuffer.Allocation = alloc; }
private SwapchainKHR CreateSwapchain(out Extent2D extent, out Format swapImageFormat, out SwapchainImage[] swapImages) { QuerySwapchainSupport(this.PhysicalDevice, out var details); var surfaceFormat = ChooseSwapSurfaceFormat(details.Formats); var presentMode = ChooseSwapPresentMode(details.PresentModes); extent = ChooseSwapExtent(details.Capabilities); var imageCount = details.Capabilities.MinImageCount + 1; if (details.Capabilities.MaxImageCount > 0 && imageCount > details.Capabilities.MaxImageCount) { imageCount = details.Capabilities.MaxImageCount; } var createInfo = new SwapchainCreateInfoKHR { SType = StructureType.SwapchainCreateInfoKhr, Surface = this.WindowSurface, MinImageCount = imageCount, ImageFormat = surfaceFormat.Format, ImageColorSpace = surfaceFormat.ColorSpace, ImageExtent = extent, ImageArrayLayers = 1, ImageUsage = ImageUsageFlags.ImageUsageColorAttachmentBit }; if (this.QueueIndices.GraphicsFamily != this.QueueIndices.PresentFamily) { createInfo.ImageSharingMode = SharingMode.Concurrent; createInfo.QueueFamilyIndexCount = 2; var indices = stackalloc uint[2] { this.QueueIndices.GraphicsFamily.Value, this.QueueIndices.PresentFamily.Value }; createInfo.PQueueFamilyIndices = indices; } else { createInfo.ImageSharingMode = SharingMode.Exclusive; } createInfo.PreTransform = details.Capabilities.CurrentTransform; createInfo.CompositeAlpha = CompositeAlphaFlagsKHR.CompositeAlphaOpaqueBitKhr; createInfo.PresentMode = presentMode; createInfo.Clipped = true; createInfo.OldSwapchain = default; SwapchainKHR swapchain; var res = this.VkSwapchain.CreateSwapchain(Device, &createInfo, null, &swapchain); if (res != Result.Success) { throw new VMASharp.VulkanResultException("Failed to create swapchain!", res); } uint count = 0; res = VkSwapchain.GetSwapchainImages(this.Device, swapchain, &count, null); if (res != Result.Success) { throw new VMASharp.VulkanResultException("Failed to retrieve swapchain images!", res); } var images = stackalloc Image[(int)count]; res = VkSwapchain.GetSwapchainImages(this.Device, swapchain, &count, images); if (res != Result.Success) { throw new VMASharp.VulkanResultException("Failed to retrieve swapchain images!", res); } var viewCreateInfo = new ImageViewCreateInfo { SType = StructureType.ImageViewCreateInfo, ViewType = ImageViewType.ImageViewType2D, Format = surfaceFormat.Format, Components = { R = ComponentSwizzle.Identity, G = ComponentSwizzle.Identity, B = ComponentSwizzle.Identity, A = ComponentSwizzle.Identity }, SubresourceRange = { AspectMask = ImageAspectFlags.ImageAspectColorBit, BaseMipLevel = 0, LevelCount = 1, BaseArrayLayer = 0, LayerCount = 1 } }; var arr = new SwapchainImage[count]; for (int i = 0; i < arr.Length; ++i) { viewCreateInfo.Image = images[i]; ImageView view = default; res = VkApi.CreateImageView(this.Device, &viewCreateInfo, null, &view); if (res != Result.Success) { throw new VMASharp.VulkanResultException("Swapchain image view creation failed!", res); } arr[i] = new SwapchainImage { Image = images[i], View = view }; } swapImageFormat = surfaceFormat.Format; swapImages = arr; return(swapchain); }