/// <summary> /// Initializes the graphic library using the specified surface target. /// </summary> /// <param name="targetSurface">The surface which the library will target.</param> public override void Initialize(ISurface targetSurface) { base.Initialize(targetSurface); SharpVk.Version engineVersion = new SharpVk.Version ( Engine.Version.Major, Engine.Version.Minor, Engine.Version.Revision ); SharpVk.Version gameVersion = new SharpVk.Version ( Engine.GameVersion.Major, Engine.GameVersion.Minor, Engine.GameVersion.Revision ); ApplicationInfo appInfo = new ApplicationInfo { ApplicationName = Engine.GameName, EngineName = Engine.Name, EngineVersion = engineVersion, ApplicationVersion = gameVersion }; DebugReportCallbackCreateInfo debugInfo = new DebugReportCallbackCreateInfo { Callback = DebugCallback, Flags = DebugFlags(), UserData = IntPtr.Zero }; List <string> validationLayers = new List <string>(); var layers = Instance.EnumerateLayerProperties(); if (layers.Any(x => x.LayerName == "VK_LAYER_LUNARG_standard_validation")) { validationLayers.Add("VK_LAYER_LUNARG_standard_validation"); } if (layers.Any(x => x.LayerName == "VK_LAYER_LUNARG_monitor")) { validationLayers.Add("VK_LAYER_LUNARG_monitor"); } if (layers.Any(x => x.LayerName == "VK_LAYER_KHRONOS_validation")) { validationLayers.Add("VK_LAYER_KHRONOS_validation"); } // - Creates the vulkan instance Handle = Instance.Create(validationLayers.ToArray(), targetSurface.Extensions, null, appInfo, debugInfo); }
public void EnableDebug(DebugReportCallback d, DebugReportFlagsExt flags = DebugReportFlagsExt.Debug | DebugReportFlagsExt.Error | DebugReportFlagsExt.Information | DebugReportFlagsExt.PerformanceWarning | DebugReportFlagsExt.Warning) { 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."); } debugCreateInfo = new DebugReportCallbackCreateInfo() { Flags = flags, PfnCallback = Marshal.GetFunctionPointerForDelegate(d) }; if (debugCallback != null) { DestroyDebugReportCallbackEXT(debugCallback); } debugCallback = CreateDebugReportCallbackEXT(debugCreateInfo); }
public DebugReportCallbackExt CreateDebugReportCallbackEXT(DebugReportCallbackCreateInfo pCreateInfo, AllocationCallbacks pAllocator = null) { Result result; DebugReportCallbackExt pCallback; unsafe { pCallback = new DebugReportCallbackExt(); fixed(UInt64 *ptrpCallback = &pCallback.m) { result = vkCreateDebugReportCallbackEXT(this.m, pCreateInfo != null ? pCreateInfo.m : (Interop.DebugReportCallbackCreateInfoExt *) default(IntPtr), pAllocator != null ? pAllocator.m : null, ptrpCallback); } if (result != Result.Success) { throw new ResultException(result); } return(pCallback); } }
public unsafe GraphicsAdapterFactoryInstance(bool enableValidation) { var applicationInfo = new ApplicationInfo { StructureType = StructureType.ApplicationInfo, ApiVersion = new SharpVulkan.Version(1, 0, 0), EngineName = Marshal.StringToHGlobalAnsi("Xenko"), //EngineVersion = new SharpVulkan.Version() }; var desiredLayerNames = new[] { //"VK_LAYER_LUNARG_standard_validation", "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_LUNARG_device_limits", "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_image", "VK_LAYER_LUNARG_core_validation", "VK_LAYER_LUNARG_swapchain", "VK_LAYER_GOOGLE_unique_objects", //"VK_LAYER_LUNARG_api_dump", //"VK_LAYER_LUNARG_vktrace" }; IntPtr[] enabledLayerNames = new IntPtr[0]; if (enableValidation) { var layers = Vulkan.InstanceLayerProperties; var availableLayerNames = new HashSet<string>(); for (int index = 0; index < layers.Length; index++) { var properties = layers[index]; var namePointer = new IntPtr(Interop.Fixed(ref properties.LayerName)); var name = Marshal.PtrToStringAnsi(namePointer); availableLayerNames.Add(name); } enabledLayerNames = desiredLayerNames .Where(x => availableLayerNames.Contains(x)) .Select(Marshal.StringToHGlobalAnsi).ToArray(); } var extensionProperties = Vulkan.GetInstanceExtensionProperties(); var availableExtensionNames = new List<string>(); var desiredExtensionNames = new List<string>(); for (int index = 0; index < extensionProperties.Length; index++) { var namePointer = new IntPtr(Interop.Fixed(ref extensionProperties[index].ExtensionName)); var name = Marshal.PtrToStringAnsi(namePointer); availableExtensionNames.Add(name); } desiredExtensionNames.Add("VK_KHR_surface"); if (!availableExtensionNames.Contains("VK_KHR_surface")) throw new InvalidOperationException("Required extension VK_KHR_surface is not available"); #if SILICONSTUDIO_PLATFORM_WINDOWS_DESKTOP desiredExtensionNames.Add("VK_KHR_win32_surface"); if (!availableExtensionNames.Contains("VK_KHR_win32_surface")) throw new InvalidOperationException("Required extension VK_KHR_win32_surface is not available"); #elif SILICONSTUDIO_PLATFORM_ANDROID desiredExtensionNames.Add("VK_KHR_android_surface"); if (!availableExtensionNames.Contains("VK_KHR_android_surface")) throw new InvalidOperationException("Required extension VK_KHR_android_surface is not available"); #elif SILICONSTUDIO_PLATFORM_LINUX if (availableExtensionNames.Contains("VK_KHR_xlib_surface")) { desiredExtensionNames.Add("VK_KHR_xlib_surface"); HasXlibSurfaceSupport = true; } else if (availableExtensionNames.Contains("VK_KHR_xcb_surface")) { desiredExtensionNames.Add("VK_KHR_xcb_surface"); } else { throw new InvalidOperationException("None of the supported surface extensions VK_KHR_xcb_surface or VK_KHR_xlib_surface is available"); } #endif bool enableDebugReport = enableValidation && availableExtensionNames.Contains("VK_EXT_debug_report"); if (enableDebugReport) desiredExtensionNames.Add("VK_EXT_debug_report"); var enabledExtensionNames = desiredExtensionNames.Select(Marshal.StringToHGlobalAnsi).ToArray(); var createDebugReportCallbackName = Marshal.StringToHGlobalAnsi("vkCreateDebugReportCallbackEXT"); try { fixed (void* enabledExtensionNamesPointer = &enabledExtensionNames[0]) { var instanceCreateInfo = new InstanceCreateInfo { StructureType = StructureType.InstanceCreateInfo, ApplicationInfo = new IntPtr(&applicationInfo), EnabledLayerCount = enabledLayerNames != null ? (uint)enabledLayerNames.Length : 0, EnabledLayerNames = enabledLayerNames?.Length > 0 ? new IntPtr(Interop.Fixed(enabledLayerNames)) : IntPtr.Zero, EnabledExtensionCount = (uint)enabledExtensionNames.Length, EnabledExtensionNames = new IntPtr(enabledExtensionNamesPointer) }; NativeInstance = Vulkan.CreateInstance(ref instanceCreateInfo); } if (enableDebugReport) { var createDebugReportCallback = (CreateDebugReportCallbackDelegate)Marshal.GetDelegateForFunctionPointer(NativeInstance.GetProcAddress((byte*)createDebugReportCallbackName), typeof(CreateDebugReportCallbackDelegate)); debugReport = DebugReport; var createInfo = new DebugReportCallbackCreateInfo { StructureType = StructureType.DebugReportCallbackCreateInfo, Flags = (uint)(DebugReportFlags.Error | DebugReportFlags.Warning /* | DebugReportFlags.PerformanceWarning | DebugReportFlags.Information | DebugReportFlags.Debug*/), Callback = Marshal.GetFunctionPointerForDelegate(debugReport) }; createDebugReportCallback(NativeInstance, ref createInfo, null, out debugReportCallback); } if (availableExtensionNames.Contains("VK_EXT_debug_marker")) { var beginDebugMarkerName = System.Text.Encoding.ASCII.GetBytes("vkCmdDebugMarkerBeginEXT"); var ptr = NativeInstance.GetProcAddress((byte*)Interop.Fixed(beginDebugMarkerName)); if (ptr != IntPtr.Zero) BeginDebugMarker = (BeginDebugMarkerDelegate)Marshal.GetDelegateForFunctionPointer(ptr, typeof(BeginDebugMarkerDelegate)); var endDebugMarkerName = System.Text.Encoding.ASCII.GetBytes("vkCmdDebugMarkerEndEXT"); ptr = NativeInstance.GetProcAddress((byte*)Interop.Fixed(endDebugMarkerName)); if (ptr != IntPtr.Zero) EndDebugMarker = (EndDebugMarkerDelegate)Marshal.GetDelegateForFunctionPointer(ptr, typeof(EndDebugMarkerDelegate)); } } finally { foreach (var enabledExtensionName in enabledExtensionNames) { Marshal.FreeHGlobal(enabledExtensionName); } foreach (var enabledLayerName in enabledLayerNames) { Marshal.FreeHGlobal(enabledLayerName); } Marshal.FreeHGlobal(applicationInfo.EngineName); Marshal.FreeHGlobal(createDebugReportCallbackName); } }
public unsafe GraphicsAdapterFactoryInstance(bool enableValidation) { var applicationInfo = new ApplicationInfo { StructureType = StructureType.ApplicationInfo, ApiVersion = new SharpVulkan.Version(1, 0, 0), EngineName = Marshal.StringToHGlobalAnsi("Xenko"), //EngineVersion = new SharpVulkan.Version() }; var desiredLayerNames = new[] { //"VK_LAYER_LUNARG_standard_validation", "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_LUNARG_device_limits", "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_image", "VK_LAYER_LUNARG_core_validation", "VK_LAYER_LUNARG_swapchain", "VK_LAYER_GOOGLE_unique_objects", //"VK_LAYER_LUNARG_api_dump", //"VK_LAYER_LUNARG_vktrace" }; IntPtr[] enabledLayerNames = new IntPtr[0]; if (enableValidation) { var layers = Vulkan.InstanceLayerProperties; var availableLayerNames = new HashSet <string>(); for (int index = 0; index < layers.Length; index++) { var properties = layers[index]; var namePointer = new IntPtr(Interop.Fixed(ref properties.LayerName)); var name = Marshal.PtrToStringAnsi(namePointer); availableLayerNames.Add(name); } enabledLayerNames = desiredLayerNames .Where(x => availableLayerNames.Contains(x)) .Select(Marshal.StringToHGlobalAnsi).ToArray(); } var extensionProperties = Vulkan.GetInstanceExtensionProperties(); var availableExtensionNames = new List <string>(); var desiredExtensionNames = new List <string>(); for (int index = 0; index < extensionProperties.Length; index++) { var namePointer = new IntPtr(Interop.Fixed(ref extensionProperties[index].ExtensionName)); var name = Marshal.PtrToStringAnsi(namePointer); availableExtensionNames.Add(name); } desiredExtensionNames.Add("VK_KHR_surface"); if (!availableExtensionNames.Contains("VK_KHR_surface")) { throw new InvalidOperationException("Required extension VK_KHR_surface is not available"); } #if SILICONSTUDIO_PLATFORM_WINDOWS_DESKTOP desiredExtensionNames.Add("VK_KHR_win32_surface"); if (!availableExtensionNames.Contains("VK_KHR_win32_surface")) { throw new InvalidOperationException("Required extension VK_KHR_win32_surface is not available"); } #elif SILICONSTUDIO_PLATFORM_ANDROID desiredExtensionNames.Add("VK_KHR_android_surface"); if (!availableExtensionNames.Contains("VK_KHR_android_surface")) { throw new InvalidOperationException("Required extension VK_KHR_android_surface is not available"); } #elif SILICONSTUDIO_PLATFORM_LINUX if (availableExtensionNames.Contains("VK_KHR_xlib_surface")) { desiredExtensionNames.Add("VK_KHR_xlib_surface"); HasXlibSurfaceSupport = true; } else if (availableExtensionNames.Contains("VK_KHR_xcb_surface")) { desiredExtensionNames.Add("VK_KHR_xcb_surface"); } else { throw new InvalidOperationException("None of the supported surface extensions VK_KHR_xcb_surface or VK_KHR_xlib_surface is available"); } #endif bool enableDebugReport = enableValidation && availableExtensionNames.Contains("VK_EXT_debug_report"); if (enableDebugReport) { desiredExtensionNames.Add("VK_EXT_debug_report"); } var enabledExtensionNames = desiredExtensionNames.Select(Marshal.StringToHGlobalAnsi).ToArray(); var createDebugReportCallbackName = Marshal.StringToHGlobalAnsi("vkCreateDebugReportCallbackEXT"); try { fixed(void *enabledExtensionNamesPointer = &enabledExtensionNames[0]) { var instanceCreateInfo = new InstanceCreateInfo { StructureType = StructureType.InstanceCreateInfo, ApplicationInfo = new IntPtr(&applicationInfo), EnabledLayerCount = enabledLayerNames != null ? (uint)enabledLayerNames.Length : 0, EnabledLayerNames = enabledLayerNames?.Length > 0 ? new IntPtr(Interop.Fixed(enabledLayerNames)) : IntPtr.Zero, EnabledExtensionCount = (uint)enabledExtensionNames.Length, EnabledExtensionNames = new IntPtr(enabledExtensionNamesPointer) }; NativeInstance = Vulkan.CreateInstance(ref instanceCreateInfo); } if (enableDebugReport) { var createDebugReportCallback = (CreateDebugReportCallbackDelegate)Marshal.GetDelegateForFunctionPointer(NativeInstance.GetProcAddress((byte *)createDebugReportCallbackName), typeof(CreateDebugReportCallbackDelegate)); debugReport = DebugReport; var createInfo = new DebugReportCallbackCreateInfo { StructureType = StructureType.DebugReportCallbackCreateInfo, Flags = (uint)(DebugReportFlags.Error | DebugReportFlags.Warning /* | DebugReportFlags.PerformanceWarning | DebugReportFlags.Information | DebugReportFlags.Debug*/), Callback = Marshal.GetFunctionPointerForDelegate(debugReport) }; createDebugReportCallback(NativeInstance, ref createInfo, null, out debugReportCallback); } if (availableExtensionNames.Contains("VK_EXT_debug_marker")) { var beginDebugMarkerName = System.Text.Encoding.ASCII.GetBytes("vkCmdDebugMarkerBeginEXT"); var ptr = NativeInstance.GetProcAddress((byte *)Interop.Fixed(beginDebugMarkerName)); if (ptr != IntPtr.Zero) { BeginDebugMarker = (BeginDebugMarkerDelegate)Marshal.GetDelegateForFunctionPointer(ptr, typeof(BeginDebugMarkerDelegate)); } var endDebugMarkerName = System.Text.Encoding.ASCII.GetBytes("vkCmdDebugMarkerEndEXT"); ptr = NativeInstance.GetProcAddress((byte *)Interop.Fixed(endDebugMarkerName)); if (ptr != IntPtr.Zero) { EndDebugMarker = (EndDebugMarkerDelegate)Marshal.GetDelegateForFunctionPointer(ptr, typeof(EndDebugMarkerDelegate)); } } } finally { foreach (var enabledExtensionName in enabledExtensionNames) { Marshal.FreeHGlobal(enabledExtensionName); } foreach (var enabledLayerName in enabledLayerNames) { Marshal.FreeHGlobal(enabledLayerName); } Marshal.FreeHGlobal(applicationInfo.EngineName); Marshal.FreeHGlobal(createDebugReportCallbackName); } }
protected virtual void CreateInstance() { var applicationInfo = new ApplicationInfo { StructureType = StructureType.ApplicationInfo, EngineVersion = 0, ApiVersion = Vulkan.ApiVersion }; var enabledLayerNames = new [] { Marshal.StringToHGlobalAnsi("VK_LAYER_LUNARG_standard_validation"), }; var enabledExtensionNames = new [] { Marshal.StringToHGlobalAnsi("VK_KHR_surface"), Marshal.StringToHGlobalAnsi("VK_KHR_win32_surface"), Marshal.StringToHGlobalAnsi("VK_EXT_debug_report"), }; try { fixed (void* enabledLayerNamesPointer = &enabledLayerNames[0]) fixed (void* enabledExtensionNamesPointer = &enabledExtensionNames[0]) { var instanceCreateInfo = new InstanceCreateInfo { StructureType = StructureType.InstanceCreateInfo, ApplicationInfo = new IntPtr(&applicationInfo), EnabledExtensionCount = (uint)enabledExtensionNames.Length, EnabledExtensionNames = new IntPtr(enabledExtensionNamesPointer), }; if (validate) { instanceCreateInfo.EnabledLayerCount = (uint)enabledLayerNames.Length; instanceCreateInfo.EnabledLayerNames = new IntPtr(enabledLayerNamesPointer); } instance = Vulkan.CreateInstance(ref instanceCreateInfo); } if (validate) { var createDebugReportCallbackName = Encoding.ASCII.GetBytes("vkCreateDebugReportCallbackEXT"); fixed (byte* createDebugReportCallbackNamePointer = &createDebugReportCallbackName[0]) { var createDebugReportCallback = Marshal.GetDelegateForFunctionPointer<CreateDebugReportCallbackDelegate>(instance.GetProcAddress(createDebugReportCallbackNamePointer)); debugReport = DebugReport; var createInfo = new DebugReportCallbackCreateInfo { StructureType = StructureType.DebugReportCallbackCreateInfo, Flags = (uint)(DebugReportFlags.Error | DebugReportFlags.Warning | DebugReportFlags.PerformanceWarning), Callback = Marshal.GetFunctionPointerForDelegate(debugReport) }; createDebugReportCallback(instance, ref createInfo, null, out debugReportCallback); } } } finally { foreach (var enabledExtensionName in enabledExtensionNames) Marshal.FreeHGlobal(enabledExtensionName); foreach (var enabledLayerName in enabledLayerNames) Marshal.FreeHGlobal(enabledLayerName); } physicalDevice = instance.PhysicalDevices[0]; var props = physicalDevice.QueueFamilyProperties; }
protected virtual void CreateInstance() { var applicationInfo = new ApplicationInfo { StructureType = StructureType.ApplicationInfo, EngineVersion = 0, ApiVersion = Vulkan.ApiVersion }; var enabledLayerNames = new [] { Marshal.StringToHGlobalAnsi("VK_LAYER_LUNARG_standard_validation"), }; var enabledExtensionNames = new [] { Marshal.StringToHGlobalAnsi("VK_KHR_surface"), Marshal.StringToHGlobalAnsi("VK_KHR_win32_surface"), Marshal.StringToHGlobalAnsi("VK_EXT_debug_report"), }; try { fixed(void *enabledLayerNamesPointer = &enabledLayerNames[0]) fixed(void *enabledExtensionNamesPointer = &enabledExtensionNames[0]) { var instanceCreateInfo = new InstanceCreateInfo { StructureType = StructureType.InstanceCreateInfo, ApplicationInfo = new IntPtr(&applicationInfo), EnabledExtensionCount = (uint)enabledExtensionNames.Length, EnabledExtensionNames = new IntPtr(enabledExtensionNamesPointer), }; if (validate) { instanceCreateInfo.EnabledLayerCount = (uint)enabledLayerNames.Length; instanceCreateInfo.EnabledLayerNames = new IntPtr(enabledLayerNamesPointer); } instance = Vulkan.CreateInstance(ref instanceCreateInfo); } if (validate) { var createDebugReportCallbackName = Encoding.ASCII.GetBytes("vkCreateDebugReportCallbackEXT"); fixed(byte *createDebugReportCallbackNamePointer = &createDebugReportCallbackName[0]) { var createDebugReportCallback = Marshal.GetDelegateForFunctionPointer <CreateDebugReportCallbackDelegate>(instance.GetProcAddress(createDebugReportCallbackNamePointer)); debugReport = DebugReport; var createInfo = new DebugReportCallbackCreateInfo { StructureType = StructureType.DebugReportCallbackCreateInfo, Flags = (uint)(DebugReportFlags.Error | DebugReportFlags.Warning | DebugReportFlags.PerformanceWarning), Callback = Marshal.GetFunctionPointerForDelegate(debugReport) }; createDebugReportCallback(instance, ref createInfo, null, out debugReportCallback); } } } finally { foreach (var enabledExtensionName in enabledExtensionNames) { Marshal.FreeHGlobal(enabledExtensionName); } foreach (var enabledLayerName in enabledLayerNames) { Marshal.FreeHGlobal(enabledLayerName); } } physicalDevice = instance.PhysicalDevices[0]; var props = physicalDevice.QueueFamilyProperties; }
public unsafe GraphicsAdapterFactoryInstance(bool enableValidation) { var applicationInfo = new ApplicationInfo { StructureType = StructureType.ApplicationInfo, ApiVersion = new SharpVulkan.Version(1, 0, 0), EngineName = Marshal.StringToHGlobalAnsi("Xenko"), //EngineVersion = new SharpVulkan.Version() }; var desiredLayerNames = new[] { //"VK_LAYER_LUNARG_standard_validation", "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_LUNARG_device_limits", "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_image", "VK_LAYER_LUNARG_core_validation", "VK_LAYER_LUNARG_swapchain", "VK_LAYER_GOOGLE_unique_objects", //"VK_LAYER_LUNARG_api_dump", //"VK_LAYER_LUNARG_vktrace" }; IntPtr[] enabledLayerNames = new IntPtr[0]; if (enableValidation) { var layers = Vulkan.InstanceLayerProperties; var availableLayerNames = new HashSet <string>(); for (int index = 0; index < layers.Length; index++) { var properties = layers[index]; var namePointer = new IntPtr(Interop.Fixed(ref properties.LayerName)); var name = Marshal.PtrToStringAnsi(namePointer); availableLayerNames.Add(name); } enabledLayerNames = desiredLayerNames .Where(x => availableLayerNames.Contains(x)) .Select(Marshal.StringToHGlobalAnsi).ToArray(); } var extensionProperties = Vulkan.GetInstanceExtensionProperties(); var availableExtensionNames = new List <string>(); var desiredExtensionNames = new List <string>(); for (int index = 0; index < extensionProperties.Length; index++) { var namePointer = new IntPtr(Interop.Fixed(ref extensionProperties[index].ExtensionName)); var name = Marshal.PtrToStringAnsi(namePointer); availableExtensionNames.Add(name); } desiredExtensionNames.Add("VK_KHR_surface"); desiredExtensionNames.Add("VK_KHR_win32_surface"); // windows desiredExtensionNames.Add("VK_KHR_android_surface"); // android desiredExtensionNames.Add("VK_KHR_xlib_surface"); // linux desiredExtensionNames.Add("VK_KHR_xcb_surface"); // linux desiredExtensionNames.Add("VK_EXT_metal_surface"); // macos desiredExtensionNames.Add("VK_NV_external_memory_capabilities"); // NVIDIA needs this one for OpenVR desiredExtensionNames.Add("VK_KHR_external_memory_capabilities"); // this one might be used in the future for OpenVR bool enableDebugReport = enableValidation && availableExtensionNames.Contains("VK_EXT_debug_report"); if (enableDebugReport) { desiredExtensionNames.Add("VK_EXT_debug_report"); } // take out any extensions not supported for (int i = 0; i < desiredExtensionNames.Count; i++) { if (availableExtensionNames.Contains(desiredExtensionNames[i]) == false) { desiredExtensionNames.RemoveAt(i); i--; } } var enabledExtensionNames = desiredExtensionNames.Select(Marshal.StringToHGlobalAnsi).ToArray(); var createDebugReportCallbackName = Marshal.StringToHGlobalAnsi("vkCreateDebugReportCallbackEXT"); try { fixed(void *enabledExtensionNamesPointer = &enabledExtensionNames[0]) { var instanceCreateInfo = new InstanceCreateInfo { StructureType = StructureType.InstanceCreateInfo, ApplicationInfo = new IntPtr(&applicationInfo), EnabledLayerCount = enabledLayerNames != null ? (uint)enabledLayerNames.Length : 0, EnabledLayerNames = enabledLayerNames?.Length > 0 ? new IntPtr(Interop.Fixed(enabledLayerNames)) : IntPtr.Zero, EnabledExtensionCount = (uint)enabledExtensionNames.Length, EnabledExtensionNames = new IntPtr(enabledExtensionNamesPointer) }; NativeInstance = Vulkan.CreateInstance(ref instanceCreateInfo); } if (enableDebugReport) { var createDebugReportCallback = (CreateDebugReportCallbackDelegate)Marshal.GetDelegateForFunctionPointer(NativeInstance.GetProcAddress((byte *)createDebugReportCallbackName), typeof(CreateDebugReportCallbackDelegate)); debugReport = DebugReport; var createInfo = new DebugReportCallbackCreateInfo { StructureType = StructureType.DebugReportCallbackCreateInfo, Flags = (uint)(DebugReportFlags.Error | DebugReportFlags.Warning /* | DebugReportFlags.PerformanceWarning | DebugReportFlags.Information | DebugReportFlags.Debug*/), Callback = Marshal.GetFunctionPointerForDelegate(debugReport) }; createDebugReportCallback(NativeInstance, ref createInfo, null, out debugReportCallback); } if (availableExtensionNames.Contains("VK_EXT_debug_marker")) { var beginDebugMarkerName = System.Text.Encoding.ASCII.GetBytes("vkCmdDebugMarkerBeginEXT"); var ptr = NativeInstance.GetProcAddress((byte *)Interop.Fixed(beginDebugMarkerName)); if (ptr != IntPtr.Zero) { BeginDebugMarker = (BeginDebugMarkerDelegate)Marshal.GetDelegateForFunctionPointer(ptr, typeof(BeginDebugMarkerDelegate)); } var endDebugMarkerName = System.Text.Encoding.ASCII.GetBytes("vkCmdDebugMarkerEndEXT"); ptr = NativeInstance.GetProcAddress((byte *)Interop.Fixed(endDebugMarkerName)); if (ptr != IntPtr.Zero) { EndDebugMarker = (EndDebugMarkerDelegate)Marshal.GetDelegateForFunctionPointer(ptr, typeof(EndDebugMarkerDelegate)); } } } finally { foreach (var enabledExtensionName in enabledExtensionNames) { Marshal.FreeHGlobal(enabledExtensionName); } foreach (var enabledLayerName in enabledLayerNames) { Marshal.FreeHGlobal(enabledLayerName); } Marshal.FreeHGlobal(applicationInfo.EngineName); Marshal.FreeHGlobal(createDebugReportCallbackName); } }
internal static unsafe extern Result vkCreateDebugReportCallbackEXT(Instance instance, DebugReportCallbackCreateInfo* createInfo, AllocationCallbacks* allocator, DebugReportCallback* callback);
public unsafe DebugReportCallback CreateDebugReportCallback(ref DebugReportCallbackCreateInfo createInfo, AllocationCallbacks* allocator = null) { DebugReportCallback callback; fixed (DebugReportCallbackCreateInfo* __createInfo__ = &createInfo) { vkCreateDebugReportCallbackEXT(this, __createInfo__, allocator, &callback).CheckError(); } return callback; }