Exemple #1
0
        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,");
            }
        }
Exemple #2
0
        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");
        }