Exemple #1
0
        public static unsafe DebugReportCallbackEXT CreateDebugReportCallback(Instance instance, DebugReportCallbackDelegate callback)
        {
            var name      = "vkCreateDebugReportCallbackEXT";
            var nameBytes = Encoding.ASCII.GetBytes(name);
            var procAddr  = Vk.GetInstanceProcAddr(instance, name);

            if (procAddr == IntPtr.Zero)
            {
                throw new NullReferenceException($"Didn't find InstanceProcAddr {nameBytes}");
            }

            debugDelegate = callback;
            GC.KeepAlive(debugDelegate);

            callbackHolder = Marshal.GetFunctionPointerForDelegate(callback);
            GC.KeepAlive(callbackHolder);

            var createDelegate = (CreateDebugReportCallbackEXT_Delegate)Marshal.GetDelegateForFunctionPointer(procAddr, typeof(CreateDebugReportCallbackEXT_Delegate));
            var createInfo     = new DebugReportCallbackCreateInfoEXT
            {
                Flags    = (DebugReportFlagsEXT)0x1F,//DebugReportFlagsEXT.Error | DebugReportFlagsEXT.Warning | DebugReportFlagsEXT.PerformanceWarning,
                Callback = callbackHolder,
            };

            var debugReportCallbackEXT = new DebugReportCallbackEXT();

            fixed(UInt64 *ptr = &debugReportCallbackEXT.NativePointer)
            {
                var result = createDelegate(instance.NativePointer, createInfo.NativePointer, null, ptr);

                if (result != Result.Success)
                {
                    throw new VulkanResultException("vkCreateDebugReportCallbackEXT", result);
                }
            }

            createInfo.Dispose();
            return(debugReportCallbackEXT);
        }