public void EnableValidation(DebugUtilsCallback d, DebugUtilsMessageTypeFlag flags = DebugUtilsMessageTypeFlag.VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | DebugUtilsMessageTypeFlag.VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT | DebugUtilsMessageTypeFlag.VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT) { if (vkCreateDebugReportCallbackEXT == null) { throw new InvalidOperationException("vkCreateDebugReportCallbackEXT is not available, possibly you might be missing VK_EXT_debug_report extension. Try to enable it when creating the Instance."); } debugUtilsCreateInfo = new DebugUtilsMessengerCreateInfoEXT() { Flags = 0, messageSeverity = DebugUtilsMessageSeverityFlag.VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | DebugUtilsMessageSeverityFlag.VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | DebugUtilsMessageSeverityFlag.VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, messageType = flags, sType = StructureType.DEBUGUTILSMESSENGERCREATEINFOEXT, pfnUserCallback = Marshal.GetFunctionPointerForDelegate(d), }; unsafe { fixed(DebugUtilsMessengerCreateInfoEXT *Debug = &debugUtilsCreateInfo) fixed(UInt64 * Callback = &aaaa) { vkCreateDebugUtilsCallbackExt.Invoke(this.m, Debug, null, Callback); } } }
public unsafe DebugUtilsMessenger(Api api) { _api = api; // Note: Logging warnings/errors may still be useful even when "debug" // logging is disabled. Consider changing this. if (api.DebugLoggingEnabled == false) { return; } var createInfo = new DebugUtilsMessengerCreateInfoEXT(); createInfo.SType = StructureType.DebugUtilsMessengerCreateInfoExt; createInfo.MessageSeverity = DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityVerboseBitExt | DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityWarningBitExt | DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityErrorBitExt | DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityInfoBitExt; createInfo.MessageType = DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypeGeneralBitExt | DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypePerformanceBitExt | DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypeValidationBitExt; createInfo.PfnUserCallback = (DebugUtilsMessengerCallbackFunctionEXT)DebugCallback; fixed(DebugUtilsMessengerEXT *debugMessenger = &_debugMessenger) { if (_api.ExtDebugUtils.CreateDebugUtilsMessenger(api.Instance.VkInstance, &createInfo, null, debugMessenger) != Result.Success) { throw new Exception($"{nameof(DebugUtilsMessenger)}: Failed to create debug messenger."); } } }
private unsafe void PopulateDebugMessengerCreateInfo(ref DebugUtilsMessengerCreateInfoEXT createInfo) { createInfo.SType = StructureType.DebugUtilsMessengerCreateInfoExt; createInfo.MessageSeverity = DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityVerboseBitExt | DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityWarningBitExt | DebugUtilsMessageSeverityFlagsEXT.DebugUtilsMessageSeverityErrorBitExt; createInfo.MessageType = DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypeGeneralBitExt | DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypePerformanceBitExt | DebugUtilsMessageTypeFlagsEXT.DebugUtilsMessageTypeValidationBitExt; createInfo.PfnUserCallback = FuncPtr.Of <DebugUtilsMessengerCallbackFunctionEXT>(DebugCallback); }
private unsafe void SetupDebugMessenger() { if (!EnableValidationLayers || !_vk.TryGetInstanceExtension(_instance, out _debugUtils)) { return; } var createInfo = new DebugUtilsMessengerCreateInfoEXT(); PopulateDebugMessengerCreateInfo(ref createInfo); fixed(DebugUtilsMessengerEXT *debugMessenger = &_debugMessenger) { Result result = _debugUtils.CreateDebugUtilsMessenger(_instance, &createInfo, null, debugMessenger); if (result != Result.Success) { throw new SystemException("Failed to setup Debug Messenger"); } } }
public abstract Result CreateDebugUtilsMessenger([Count(Count = 0)] Instance instance, [Count(Count = 0), Flow(FlowDirection.In)] ref DebugUtilsMessengerCreateInfoEXT pCreateInfo, [Count(Count = 0), Flow(FlowDirection.In)] ref AllocationCallbacks pAllocator, [Count(Count = 0), Flow(FlowDirection.Out)] out DebugUtilsMessengerEXT pMessenger);
private unsafe void CreateInstance() { _vk = Vk.GetApi(); if (EnableValidationLayers && !CheckValidationLayerSupport()) { throw new NotSupportedException("Validation layers requested but not available!"); } var appInfo = new ApplicationInfo { SType = StructureType.ApplicationInfo, PApplicationName = (byte *)Marshal.StringToHGlobalAnsi("Hello Triangle"), ApplicationVersion = Vk.MakeVersion(1, 0), PEngineName = (byte *)Marshal.StringToHGlobalAnsi("No Engine"), EngineVersion = Vk.MakeVersion(1, 0), ApiVersion = Vk.Version11 }; var extensions = (byte **)_window.VkSurface.GetRequiredExtensions(out var extCount); byte **newExtensions = stackalloc byte *[(int)(extCount + _instanceExtensions.Length)]; for (int i = 0; i < extCount; i++) { newExtensions[i] = extensions[i]; } for (var i = 0; i < _instanceExtensions.Length; i++) { newExtensions[extCount + i] = (byte *)SilkMarshal.MarshalStringToPtr(_instanceExtensions[i]); } extCount += (uint)_instanceExtensions.Length; var createInfo = new InstanceCreateInfo { SType = StructureType.InstanceCreateInfo, PApplicationInfo = &appInfo, EnabledExtensionCount = extCount, PpEnabledExtensionNames = newExtensions }; // debug info is here to make sure it doesnt get destroyed before vk.CreateInstance var debugCreateInfo = new DebugUtilsMessengerCreateInfoEXT(); if (EnableValidationLayers) { createInfo.EnabledLayerCount = (uint)_validationLayers.Length; createInfo.PpEnabledLayerNames = (byte **)SilkMarshal.MarshalStringArrayToPtr(_validationLayers); createInfo.PNext = &debugCreateInfo; } else { createInfo.EnabledLayerCount = 0; createInfo.PNext = null; } fixed(Instance *instance = &_instance) { Result result = _vk.CreateInstance(&createInfo, null, instance); if (result != Result.Success) { throw new Exception("Failed to create instance!"); } } _vk.CurrentInstance = _instance; if (!_vk.TryGetInstanceExtension(_instance, out _vkSurface)) { throw new NotSupportedException("KHR_surface extensions not found"); } }