public static Vk.Format FindSupportedFormat(VkContext state, IEnumerable <Vk.Format> candidates, Vk.ImageTiling tiling, Vk.FormatFeatureFlags features) { foreach (Vk.Format format in candidates) { var props = state.PhysicalDevice.GetFormatProperties(format); if (tiling == Vk.ImageTiling.Linear && (props.LinearTilingFeatures & features) != 0) { return(format); } else if (tiling == Vk.ImageTiling.Optimal && (props.OptimalTilingFeatures & features) != 0) { return(format); } } throw new System.Exception("Failed to find a supported format."); }
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); }