public SurfaceFormatKHR ( Format format = default, ColorSpaceKHR colorSpace = default ) { Format = format; ColorSpace = colorSpace; }
public static int Rate(ColorSpaceKHR colorSpace) { switch (colorSpace) { case ColorSpaceKHR.ColorSpaceSrgbNonlinearKhr: return(1000); case ColorSpaceKHR.ColorSpaceDisplayP3NonlinearExt: return(555); case ColorSpaceKHR.ColorSpaceExtendedSrgbLinearExt: return(900); case ColorSpaceKHR.ColorSpaceDisplayP3LinearExt: return(540); case ColorSpaceKHR.ColorSpaceDciP3NonlinearExt: return(550); case ColorSpaceKHR.ColorSpaceBT709LinearExt: return(650); case ColorSpaceKHR.ColorSpaceBT709NonlinearExt: return(655); case ColorSpaceKHR.ColorSpaceBT2020LinearExt: return(680); case ColorSpaceKHR.ColorSpaceHdr10ST2084Ext: return(900); case ColorSpaceKHR.ColorSpaceDolbyvisionExt: return(500); case ColorSpaceKHR.ColorSpaceHdr10HlgExt: return(900); case ColorSpaceKHR.ColorSpaceAdobergbLinearExt: return(799); case ColorSpaceKHR.ColorSpaceAdobergbNonlinearExt: return(800); case ColorSpaceKHR.ColorSpaceExtendedSrgbNonlinearExt: return(950); case ColorSpaceKHR.ColorSpaceDisplayNativeAmd: return(500); default: return(0); } }
public SwapchainCreateInfoKHR ( StructureType sType = StructureType.SwapchainCreateInfoKhr, void *pNext = default, SwapchainCreateFlagsKHR flags = default, SurfaceKHR surface = default, uint minImageCount = default, Format imageFormat = default, ColorSpaceKHR imageColorSpace = default, Extent2D imageExtent = default, uint imageArrayLayers = default, ImageUsageFlags imageUsage = default, SharingMode imageSharingMode = default, uint queueFamilyIndexCount = default, uint *pQueueFamilyIndices = default, SurfaceTransformFlagsKHR preTransform = default, CompositeAlphaFlagsKHR compositeAlpha = default, PresentModeKHR presentMode = default, Bool32 clipped = default, SwapchainKHR oldSwapchain = default ) { SType = sType; PNext = pNext; Flags = flags; Surface = surface; MinImageCount = minImageCount; ImageFormat = imageFormat; ImageColorSpace = imageColorSpace; ImageExtent = imageExtent; ImageArrayLayers = imageArrayLayers; ImageUsage = imageUsage; ImageSharingMode = imageSharingMode; QueueFamilyIndexCount = queueFamilyIndexCount; PQueueFamilyIndices = pQueueFamilyIndices; PreTransform = preTransform; CompositeAlpha = compositeAlpha; PresentMode = presentMode; Clipped = clipped; OldSwapchain = oldSwapchain; }
public _SwapchainCreateInfoKHR(SwapchainCreateInfoKHR info) { SType = info.type; Next = info.next; Flags = info.flags; Surface = info.surface; MinImageCount = info.minImageCount; ImageFormat = info.imageFormat; ImageColorSpace = info.imageColorSpace; ImageExtent = info.imageExtent; ImageArrayLayers = info.imageArrayLayers; ImageUsage = info.imageUsage; ImageSharingMode = info.imageSharingMode; QueueFamilyIndexCount = (UInt32)(info.queueFamilyIndices?.Count ?? 0); QueueFamilyIndices = info.queueFamilyIndices != null?Alloc.alloc(info.queueFamilyIndices) : IntPtr.Zero; PreTransform = info.preTransform; CompositeAlpha = info.compositeAlpha; PresentMode = info.presentMode; Clipped = info.clipped; OldSwapchain = info.oldSwapchain; }
/// <param name="Surface">The swapchain's target surface</param> /// <param name="MinImageCount">Minimum number of presentation images the application needs</param> /// <param name="ImageFormat">Format of the presentation images</param> /// <param name="ImageColorSpace">Colorspace of the presentation images</param> /// <param name="ImageExtent">Dimensions of the presentation images</param> /// <param name="ImageArrayLayers">Determines the number of views for multiview/stereo presentation</param> /// <param name="ImageUsage">Bits indicating how the presentation images will be used</param> /// <param name="ImageSharingMode">Sharing mode used for the presentation images</param> /// <param name="QueueFamilyIndices">Array of queue family indices having access to the images in case of concurrent sharing mode</param> /// <param name="PreTransform">The transform, relative to the device's natural orientation, applied to the image content prior to presentation</param> /// <param name="CompositeAlpha">The alpha blending mode used when compositing this surface with other surfaces in the window system</param> /// <param name="PresentMode">Which presentation mode to use for presents on this swap chain</param> /// <param name="Clipped">Specifies whether presentable images may be affected by window clip regions</param> public SwapchainCreateInfoKHR(SurfaceKHR Surface, UInt32 MinImageCount, Format ImageFormat, ColorSpaceKHR ImageColorSpace, Extent2D ImageExtent, UInt32 ImageArrayLayers, ImageUsageFlags ImageUsage, SharingMode ImageSharingMode, UInt32[] QueueFamilyIndices, SurfaceTransformFlagsKHR PreTransform, CompositeAlphaFlagsKHR CompositeAlpha, PresentModeKHR PresentMode, Bool32 Clipped) : this() { this.Surface = Surface; this.MinImageCount = MinImageCount; this.ImageFormat = ImageFormat; this.ImageColorSpace = ImageColorSpace; this.ImageExtent = ImageExtent; this.ImageArrayLayers = ImageArrayLayers; this.ImageUsage = ImageUsage; this.ImageSharingMode = ImageSharingMode; this.QueueFamilyIndices = QueueFamilyIndices; this.PreTransform = PreTransform; this.CompositeAlpha = CompositeAlpha; this.PresentMode = PresentMode; this.Clipped = Clipped; }
private void InitializeVulkan(string applicationName, uint applicationVersion) { Console.WriteLine("Initializing Vulkan"); #if VALIDITION DebugUtilsMessengerCreateInfoEXT GetDebugMessenger(void *pNext) { return(new DebugUtilsMessengerCreateInfoEXT( messageSeverity: DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityVerboseBitExt | DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityInfoBitExt | DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityWarningBitExt | DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityErrorBitExt, messageType: DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypeGeneralBitExt | DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypePerformanceBitExt | DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypeValidationBitExt, pfnUserCallback: new PfnDebugUtilsMessengerCallbackEXT(DebugCallback), pNext: pNext)); } #endif _vk = Vk.GetApi(); const uint engineVersion = 1; const string engineName = "Videre"; var instanceLayers = new List <string>(); var instanceExtensions = new List <string>(); var pApplicationName = SilkMarshal.StringToPtr(applicationName); var pEngineName = SilkMarshal.StringToPtr(engineName); var applicationInfo = new ApplicationInfo(pApplicationName: (byte *)pApplicationName, applicationVersion: applicationVersion, pEngineName: (byte *)pEngineName, engineVersion: engineVersion, apiVersion: new Version32(1, 1, 0)); Version32 apiVersion = default; _vk.EnumerateInstanceVersion((uint *)&apiVersion); Console.WriteLine($"Instance Version: {apiVersion.Major}.{apiVersion.Minor}.{apiVersion.Patch}"); void *instancepNext = default; // instanceExtensions.Add(KhrSurface.ExtensionName); instanceExtensions.AddRange(SilkMarshal.PtrToStringArray((nint)View.VkSurface.GetRequiredExtensions(out var requiredExtensionsCount), (int)requiredExtensionsCount)); instanceExtensions.Add(ExtDebugUtils.ExtensionName); Console.WriteLine($"Creating Instance with {instanceExtensions.Count} extensions"); VerifyInstanceExtensionsAvailable(_vk, instanceExtensions); var ppEnabledLayers = instanceLayers.Count > 0 ? (byte **)SilkMarshal.StringArrayToPtr(instanceLayers) : null; var ppEnabledExtensions = instanceExtensions.Count > 0 ? (byte **)SilkMarshal.StringArrayToPtr(instanceExtensions) : null; _vk.CreateInstance( new InstanceCreateInfo(pApplicationInfo: &applicationInfo, enabledLayerCount: (uint)instanceLayers.Count, ppEnabledLayerNames: ppEnabledLayers, enabledExtensionCount: (uint)instanceExtensions.Count, ppEnabledExtensionNames: ppEnabledExtensions, pNext: instancepNext), _allocationCallbacks.AllocationCallbacks, out _instance) .ThrowCode(); SilkMarshal.Free((nint)ppEnabledLayers); SilkMarshal.Free((nint)ppEnabledExtensions); _vk.CurrentInstance = _instance; if (!_vk.TryGetInstanceExtension(_instance, out _khrSurface)) { Console.WriteLine($"Could not load {KhrSurface.ExtensionName}"); } _vk.TryGetInstanceExtension(_instance, out _debugUtils); Console.WriteLine("Creating Surface"); _surface = View.VkSurface.Create(_instance.ToHandle(), (AllocationCallbacks *)null).ToSurface(); uint deviceCount = 0; _vk.EnumeratePhysicalDevices(_instance, ref deviceCount, null).ThrowCode(); var devices = (PhysicalDevice *)SilkMarshal.Allocate((int)(deviceCount * sizeof(PhysicalDevice))); _vk.EnumeratePhysicalDevices(_instance, ref deviceCount, devices).ThrowCode(); Console.WriteLine($"Found {deviceCount} devices"); Console.WriteLine("Creating Device"); // TODO: actually somehow reasonably find the best device. for (int i = 0; i < deviceCount; i++) { var physicalDevice = devices[i]; _physicalDeviceFeatures = _vk.GetPhysicalDeviceFeature(physicalDevice); uint presentModeCount = 0; _khrSurface.GetPhysicalDeviceSurfacePresentModes(physicalDevice, _surface, ref presentModeCount, null).ThrowCode(); if (presentModeCount <= 0) { continue; } var presentModes = (PresentModeKHR *)SilkMarshal.Allocate((int)(presentModeCount * sizeof(PresentModeKHR))); _khrSurface.GetPhysicalDeviceSurfacePresentModes(physicalDevice, _surface, ref presentModeCount, presentModes).ThrowCode(); _presentMode = PresentModeKHR.PresentModeFifoKhr; View.FramesPerSecond = -1; for (int j = 0; j < presentModeCount; j++) { if (presentModes[j] == PresentModeKHR.PresentModeMailboxKhr) { _presentMode = PresentModeKHR.PresentModeMailboxKhr; View.FramesPerSecond = -1; break; } } SilkMarshal.Free((nint)presentModes); uint surfaceFormatCount = 0; _khrSurface.GetPhysicalDeviceSurfaceFormats(physicalDevice, _surface, ref surfaceFormatCount, null).ThrowCode(); var surfaceFormats = (SurfaceFormatKHR *)SilkMarshal.Allocate((int)(surfaceFormatCount * sizeof(SurfaceFormatKHR))); _khrSurface.GetPhysicalDeviceSurfaceFormats(physicalDevice, _surface, ref surfaceFormatCount, surfaceFormats).ThrowCode(); int max = int.MinValue; SurfaceFormatKHR maxFormat = surfaceFormats[0]; for (int j = 0; j < surfaceFormatCount; j++) { var score = FormatRater.Rate(surfaceFormats[j].Format) + ColorSpaceRater.Rate(surfaceFormats[j].ColorSpace); if (score > max) { max = score; maxFormat = surfaceFormats[j]; } } SilkMarshal.Free((nint)surfaceFormats); _swapchainFormat = maxFormat.Format; _swapchainColorSpace = maxFormat.ColorSpace; Console.WriteLine($"Chose Swapchain Properties: {Enum.GetName(typeof(PresentModeKHR), _presentMode)} {Enum.GetName(typeof(Format), _swapchainFormat)} {Enum.GetName(typeof(ColorSpaceKHR), _swapchainColorSpace)}"); _khrSurface.GetPhysicalDeviceSurfaceCapabilities(physicalDevice, _surface, out var surfaceCapabilities).ThrowCode(); uint queueFamilyPropertyCount = 0; _vk.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, ref queueFamilyPropertyCount, null); var deviceQueueFamilyProperties = (QueueFamilyProperties *)SilkMarshal.Allocate((int)(queueFamilyPropertyCount * sizeof(QueueFamilyProperties))); _vk.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, ref queueFamilyPropertyCount, deviceQueueFamilyProperties); var queueCreateInfoList = new List <DeviceQueueCreateInfo>(); var deviceExtensions = new List <string>(); var deviceLayers = new List <string>(); for (int j = 0; j < queueFamilyPropertyCount; j++) { var queueCount = deviceQueueFamilyProperties[j].QueueCount; float *pQueuePriorities = stackalloc float[(int)queueCount]; // queue count should generally be 1 for (int k = 0; k < queueCount; k++) { pQueuePriorities[k] = 1.0f; } queueCreateInfoList.Add(new DeviceQueueCreateInfo(queueFamilyIndex: (uint)j, queueCount: queueCount, pQueuePriorities: pQueuePriorities)); } deviceExtensions.Add(KhrSwapchain.ExtensionName); // deviceExtensions.Add(KhrSynchronization2.ExtensionName); // deviceExtensions.Add(ExtBufferDeviceAddress.ExtensionName); var features = new PhysicalDeviceFeatures(); features.ShaderInt64 = true; void *devicePNext = null; // var physicalDeviceDescriptorIndexingFeaturesExt = new PhysicalDeviceDescriptorIndexingFeaturesEXT( // descriptorBindingSampledImageUpdateAfterBind: true, // descriptorBindingStorageBufferUpdateAfterBind: true, // descriptorBindingStorageImageUpdateAfterBind: true, // descriptorBindingUniformBufferUpdateAfterBind: true, // descriptorBindingStorageTexelBufferUpdateAfterBind: true, // descriptorBindingUniformTexelBufferUpdateAfterBind: true, // descriptorBindingUpdateUnusedWhilePending: true, // runtimeDescriptorArray: true, // pNext: devicePNext); // devicePNext = &physicalDeviceDescriptorIndexingFeaturesExt; // var physicalDeviceBufferDeviceAddressFeatures = new PhysicalDeviceBufferDeviceAddressFeatures(bufferDeviceAddress: true, #if DEBUG bufferDeviceAddressCaptureReplay: true, #endif pNext: devicePNext); devicePNext = &physicalDeviceBufferDeviceAddressFeatures; // var version12 = new PhysicalDeviceVulkan12Features(bufferDeviceAddress: true, // #if DEBUG // bufferDeviceAddressCaptureReplay: true, // #endif // descriptorBindingSampledImageUpdateAfterBind: true, // descriptorBindingStorageBufferUpdateAfterBind: true, // descriptorBindingStorageImageUpdateAfterBind: true, // descriptorBindingUniformBufferUpdateAfterBind: true, // descriptorBindingStorageTexelBufferUpdateAfterBind: true, // descriptorBindingUniformTexelBufferUpdateAfterBind: true, // descriptorBindingUpdateUnusedWhilePending: true, // runtimeDescriptorArray: true, // pNext: devicePNext); // devicePNext = &version12; var queueCreateInfos = queueCreateInfoList.Distinct().ToArray(); queueCreateInfoList = null; VerifyDeviceExtensionsAvailable(_vk, devices[i], deviceExtensions, ref deviceLayers); _physicalDevice = devices[i]; Console.WriteLine("Creating Logical Device"); var ppDeviceExtensions = deviceExtensions.Count > 0 ? (byte **)SilkMarshal.StringArrayToPtr(deviceExtensions) : null; var ppDeviceLayers = deviceLayers.Count > 0 ? (byte **)SilkMarshal.StringArrayToPtr(deviceLayers) : null; fixed(DeviceQueueCreateInfo *pQueueCreateInfos = queueCreateInfos) _vk.CreateDevice(physicalDevice, new DeviceCreateInfo(queueCreateInfoCount: (uint)queueCreateInfos.Length, pQueueCreateInfos: pQueueCreateInfos, enabledExtensionCount: (uint)deviceExtensions.Count, enabledLayerCount: (uint)deviceLayers.Count, ppEnabledExtensionNames: ppDeviceExtensions, ppEnabledLayerNames: ppDeviceLayers, pEnabledFeatures: &features, pNext: devicePNext), null, out _logicalDevice) .ThrowCode(); _vk.CurrentDevice = _logicalDevice; if (!_vk.TryGetDeviceExtension(_instance, _logicalDevice, out _khrSwapchain)) { Console.WriteLine($"Could not load {KhrSwapchain.ExtensionName}!"); } _queueManager = new(_vk, _khrSurface, _instance, _physicalDevice, _logicalDevice, _surface, new Span <QueueFamilyProperties>(deviceQueueFamilyProperties, (int)queueFamilyPropertyCount)); Console.WriteLine($"{_queueManager.QueueCount} queues found"); SilkMarshal.Free((nint)ppDeviceExtensions); SilkMarshal.Free((nint)ppDeviceLayers); SilkMarshal.Free((nint)deviceQueueFamilyProperties); break; } SilkMarshal.Free((nint)devices); Console.WriteLine("Initialized Vulkan"); }
public unsafe void ChangeTargetImages( Vector2D <uint> targetSize, ReadOnlyMemory <Image> targetImages, Format format, ColorSpaceKHR colorSpace) { _commandAllocs = new Allocation[targetImages.Length]; _commandBuffers = new Buffer[targetImages.Length]; _commandBufferCapacities = new int[targetImages.Length]; _commandBufferCapacities.AsSpan().Fill(-1); if (_descriptorPool.Handle != 0) { _vk.DestroyDescriptorPool(_device, _descriptorPool, null); } _targetSize = targetSize; _targetImages = targetImages; _targetImageViews = new ImageView[targetImages.Length]; var poolSizes = stackalloc DescriptorPoolSize[] { new DescriptorPoolSize(DescriptorType.StorageImage, (uint)targetImages.Length), new DescriptorPoolSize(DescriptorType.StorageBuffer, (uint)targetImages.Length), }; _vk.CreateDescriptorPool(_device, new DescriptorPoolCreateInfo(maxSets: (uint)targetImages.Length, poolSizeCount: 2, pPoolSizes: poolSizes), null, out _descriptorPool).ThrowCode(); Name(ObjectType.DescriptorPool, _descriptorPool.Handle, $"Target Descriptor Pool"); _targetDescriptorSets = new DescriptorSet[targetImages.Length]; var setLayouts = stackalloc DescriptorSetLayout[targetImages.Length]; new Span <DescriptorSetLayout>(setLayouts, targetImages.Length).Fill(_setLayout); var info = new DescriptorSetAllocateInfo(descriptorPool: _descriptorPool, descriptorSetCount: (uint)targetImages.Length, pSetLayouts: setLayouts); _vk.AllocateDescriptorSets(_device, &info, _targetDescriptorSets.AsSpan()).ThrowCode(); var imageInfos = stackalloc DescriptorImageInfo[targetImages.Length]; Span <WriteDescriptorSet> writes = stackalloc WriteDescriptorSet[targetImages.Length]; for (int i = 0; i < targetImages.Length; i++) { Name(ObjectType.Image, _targetImages.Span[i].Handle, $"Target Image {i}"); // _vk.CreateImage(_device, // new ImageCreateInfo(imageType: ImageType.ImageType2D, format: Format.R8G8B8A8Srgb, // extent: new Extent3D(_targetSize.X, _targetSize.Y, 1), mipLevels: 1, arrayLayers: 1, // samples: SampleCountFlags.SampleCount1Bit, tiling: ImageTiling.Optimal, // initialLayout: ImageLayout.Undefined, usage: ImageUsageFlags.ImageUsageStorageBit, // sharingMode: SharingMode.Exclusive, queueFamilyIndexCount: 0, pQueueFamilyIndices: null), null, // out _ownImages[i]).ThrowCode(); _vk.CreateImageView(_device, new ImageViewCreateInfo(image: _targetImages.Span[i], viewType: ImageViewType.ImageViewType2D, format: format, components: new ComponentMapping(ComponentSwizzle.Identity, ComponentSwizzle.Identity, ComponentSwizzle.Identity, ComponentSwizzle.Identity), subresourceRange: new ImageSubresourceRange(ImageAspectFlags.ImageAspectColorBit, 0, 1, 0, 1)), null, out _targetImageViews[i]).ThrowCode(); Name(ObjectType.ImageView, _targetImageViews[i].Handle, $"Target Image View {i}"); imageInfos[i] = new DescriptorImageInfo(imageView: _targetImageViews[i], imageLayout: ImageLayout.General); writes[i] = new WriteDescriptorSet(dstSet: _targetDescriptorSets[i], dstBinding: 0, dstArrayElement: 0, descriptorCount: 1, descriptorType: DescriptorType.StorageImage, pImageInfo: (imageInfos + i)); Name(ObjectType.DescriptorSet, _targetDescriptorSets[i].Handle, $"Target Descriptor {i}"); } _vk.UpdateDescriptorSets(_device, (uint)targetImages.Length, writes, 0, (CopyDescriptorSet *)null); }