public unsafe VulkanDebugMessenger(VulkanInstance instance) : base(instance.VK) { _DebugUtils = instance.GetInstanceExtension <ExtDebugUtils>(); DebugUtilsMessengerCreateInfoEXT createInfo = new DebugUtilsMessengerCreateInfo(StructureType.DebugUtilsMessengerCreateInfoExt, null, 0u, _MESSAGE_SEVERITY_IMPORTANT, DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypeGeneralBitExt | DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypeValidationBitExt | DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypePerformanceBitExt, &DebugCallback ); Result result = _DebugUtils.CreateDebugUtilsMessenger(instance, &createInfo, (AllocationCallbacks *)null !, out _Messenger); if (result is not Result.Success) { throw new VulkanException(result, "Failed to create debug messenger,"); } }
public unsafe void Initialize( int maxFrames, QueueManager queueManager, Vk vk, Instance instance, Device device, PhysicalDevice physicalDevice #if DEBUG , ExtDebugUtils debugUtils #endif ) { #if DEBUG _debugUtils = debugUtils; #endif _vma = new VulkanMemoryAllocator(new VulkanMemoryAllocatorCreateInfo(new Version32(1, 1, 0), vk, instance, physicalDevice, device, AllocatorCreateFlags.BufferDeviceAddress)); _frames = new FrameData[maxFrames]; _queueManager = queueManager; _vk = vk; _instance = instance; _device = device; // if (!_vk.TryGetDeviceExtension(_instance, _device, out _khrSynchronization2)) // throw new Exception($"{KhrSynchronization2.ExtensionName} not found!"); Console.WriteLine("Initializing Render Graph"); (QueueFamilyIndex, Queue) = _queueManager.GetQueue(true, true, false, true); Console.WriteLine("Creating Command Pools"); for (int i = 0; i < _frames.Length; i++) { _vk.CreateCommandPool(_device, new CommandPoolCreateInfo(queueFamilyIndex: QueueFamilyIndex), null, out var commandPool).ThrowCode(); _frames[i] = new FrameData(commandPool); } Console.WriteLine("Creating Descriptor Layout"); var bindings = stackalloc DescriptorSetLayoutBinding[] { new DescriptorSetLayoutBinding(0, DescriptorType.StorageImage, 1, ShaderStageFlags.ShaderStageComputeBit, null), new DescriptorSetLayoutBinding(1, DescriptorType.StorageBuffer, 1, ShaderStageFlags.ShaderStageComputeBit, null), }; _vk.CreateDescriptorSetLayout(_device, new DescriptorSetLayoutCreateInfo(bindingCount: 2, pBindings: bindings), null, out var setLayout).ThrowCode(); _setLayout = setLayout; Name(ObjectType.DescriptorSetLayout, _setLayout.Handle, "Primary Set Layout"); var pushConstantRange = new PushConstantRange(ShaderStageFlags.ShaderStageComputeBit, 0, sizeof(uint) * 2); _vk.CreatePipelineLayout(_device, new PipelineLayoutCreateInfo(setLayoutCount: 1, pSetLayouts: &setLayout, pushConstantRangeCount: 1, pPushConstantRanges: &pushConstantRange), null, out _pipelineLayout).ThrowCode(); Name(ObjectType.PipelineLayout, _pipelineLayout.Handle, "Primary Pipeline Layout"); Console.WriteLine("Loading Primary Compute"); _computeShader = new ComputeShader(vk, instance, device, physicalDevice, _pipelineLayout, (ReadOnlySpan <byte>)File.ReadAllBytes("./shaders/compute.spv"), "main", null); _vk.GetPhysicalDeviceMemoryProperties(physicalDevice, out var memoryProperties); _memoryTypes = new MemoryType[32]; new Span <MemoryType>(&memoryProperties.MemoryTypes.Element0, 32).CopyTo(_memoryTypes); EngineContext = new EngineContext(); Console.WriteLine("Done Initializing Render Graph"); }