public static Vk.ImageView CreateImageView(VkContext state, Vk.Image image, Vk.Format format, Vk.ImageAspectFlags aspectFlags) { var subresourceRange = new Vk.ImageSubresourceRange(); subresourceRange.AspectMask = aspectFlags; subresourceRange.BaseMipLevel = 0; subresourceRange.LevelCount = 1; subresourceRange.BaseArrayLayer = 0; subresourceRange.LayerCount = 1; var viewInfo = new Vk.ImageViewCreateInfo(); viewInfo.Image = image; viewInfo.ViewType = Vk.ImageViewType.View2D; viewInfo.Format = format; viewInfo.SubresourceRange = subresourceRange; return(state.Device.CreateImageView(viewInfo)); }
public static ImageWithMemory CreateImage(VkContext state, uint width, uint height, Vk.Format format, Vk.ImageTiling tiling, Vk.ImageUsageFlags usageFlags, Vk.MemoryPropertyFlags props) { var extent = new Vk.Extent3D(); extent.Width = width; extent.Height = height; extent.Depth = 1; var imageInfo = new Vk.ImageCreateInfo(); imageInfo.ImageType = Vk.ImageType.Image2D; imageInfo.Extent = extent; imageInfo.MipLevels = 1; imageInfo.ArrayLayers = 1; imageInfo.Format = format; imageInfo.Tiling = tiling; imageInfo.InitialLayout = Vk.ImageLayout.Undefined; imageInfo.Usage = usageFlags; imageInfo.Samples = Vk.SampleCountFlags.Count1; imageInfo.SharingMode = Vk.SharingMode.Exclusive; var image = new ImageWithMemory(); image.Image = state.Device.CreateImage(imageInfo); var memoryReqs = state.Device.GetImageMemoryRequirements(image.Image); var allocInfo = new Vk.MemoryAllocateInfo(); allocInfo.AllocationSize = memoryReqs.Size; allocInfo.MemoryTypeIndex = FindMemoryType(memoryReqs.MemoryTypeBits, state.PhysicalDevice, props); image.Memory = state.Device.AllocateMemory(allocInfo); image.Bind(state.Device, 0); return(image); }
public void TransitionImageLayout(Vk.Image image, Vk.Format format, Vk.ImageLayout oldLayout, Vk.ImageLayout newLayout) { var buffer = this.BeginSingleTimeCommands(this.GraphicsCommandPool); var subresourceRange = new Vk.ImageSubresourceRange(); if (newLayout == Vk.ImageLayout.DepthStencilAttachmentOptimal) { subresourceRange.AspectMask = Vk.ImageAspectFlags.Depth; if (VkHelper.HasStencilComponent(format)) { subresourceRange.AspectMask |= Vk.ImageAspectFlags.Stencil; } } else { subresourceRange.AspectMask = Vk.ImageAspectFlags.Color; } subresourceRange.BaseMipLevel = 0; subresourceRange.LevelCount = 1; subresourceRange.BaseArrayLayer = 0; subresourceRange.LayerCount = 1; Vk.PipelineStageFlags srcStage; Vk.PipelineStageFlags dstStage; var barrier = new Vk.ImageMemoryBarrier(); barrier.OldLayout = oldLayout; barrier.NewLayout = newLayout; barrier.SrcQueueFamilyIndex = VkConstants.VK_QUEUE_FAMILY_IGNORED; barrier.DstQueueFamilyIndex = VkConstants.VK_QUEUE_FAMILY_IGNORED; if (oldLayout == Vk.ImageLayout.Undefined && newLayout == Vk.ImageLayout.TransferDstOptimal) { barrier.SrcAccessMask = 0; barrier.DstAccessMask = Vk.AccessFlags.TransferWrite; srcStage = Vk.PipelineStageFlags.TopOfPipe; dstStage = Vk.PipelineStageFlags.Transfer; } else if (oldLayout == Vk.ImageLayout.TransferDstOptimal && newLayout == Vk.ImageLayout.ShaderReadOnlyOptimal) { barrier.SrcAccessMask = Vk.AccessFlags.TransferWrite; barrier.DstAccessMask = Vk.AccessFlags.ShaderRead; srcStage = Vk.PipelineStageFlags.Transfer; dstStage = Vk.PipelineStageFlags.FragmentShader; } else if (oldLayout == Vk.ImageLayout.Undefined && newLayout == Vk.ImageLayout.DepthStencilAttachmentOptimal) { barrier.SrcAccessMask = 0; barrier.DstAccessMask = Vk.AccessFlags.DepthStencilAttachmentRead | Vk.AccessFlags.DepthStencilAttachmentWrite; srcStage = Vk.PipelineStageFlags.TopOfPipe; dstStage = Vk.PipelineStageFlags.EarlyFragmentTests; } else { throw new Exception("Unsupported layout transition."); } barrier.Image = image; barrier.SubresourceRange = subresourceRange; buffer.CmdPipelineBarrier(srcStage, dstStage, 0, null, null, new Vk.ImageMemoryBarrier[] { barrier }); this.EndSingleTimeCommands(this.GraphicsQueue, this.GraphicsCommandPool, buffer); }
public static bool HasStencilComponent(Vk.Format format) => format == Vk.Format.D32SfloatS8Uint || format == Vk.Format.D24UnormS8Uint;