private unsafe VkResult CreateDebugReportCallback(
            VkDebugReportFlagsEXT flags
            )
        {
            _debugCallbackFunction = DebugCallback;
            var debugFunctionPtr  = Marshal.GetFunctionPointerForDelegate(_debugCallbackFunction);
            var debugCallbackInfo = new VkDebugReportCallbackCreateInfoEXT
            {
                sType       = VkStructureType.DebugReportCallbackCreateInfoEXT,
                flags       = flags,
                pfnCallback = debugFunctionPtr
            };

            var createFunctionPtr = VulkanNative.vkGetInstanceProcAddr(
                _handle,
                new FixedUtf8String("vkCreateDebugReportCallbackEXT")
                );

            if (createFunctionPtr == IntPtr.Zero)
            {
                return(VkResult.ErrorValidationFailedEXT);
            }

            var createDelegate = Marshal.GetDelegateForFunctionPointer <vkCreateDebugReportCallbackEXT_d>(
                createFunctionPtr
                );

            return(createDelegate(
                       _handle,
                       &debugCallbackInfo,
                       IntPtr.Zero,
                       out _debugCallbackHandle
                       ));
        }
Beispiel #2
0
 public static extern void DebugReportMessageEXT(
     VkInstance instance,
     VkDebugReportFlagsEXT flags,
     VkDebugReportObjectTypeEXT objectType,
     ulong _object,
     ulong location,
     int messageCode,
     byte[] pLayerPrefix,
     byte[] pMessage
     );
Beispiel #3
0
        private static bool DebugReport(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, ulong @object, nuint location, int messageCode, string layerPrefix, string message, IntPtr userData)
        {
            string debugMessage = $"{flags}: {message} ([{messageCode}] {layerPrefix})";

            Debug.WriteLine(debugMessage);
            if (GraphicsAdapterFactory.adapterFlags == DeviceCreationFlags.DebugAndBreak)
            {
                Debugger.Break();
            }
            return(false);
        }
Beispiel #4
0
        void DebugCallback(
            VkDebugReportFlagsEXT flags,
            VkDebugReportObjectTypeEXT objectType,
            long _object, long location,
            int messageCode, string layerPrefix, string message)
        {
            string type = flags.ToString();

            type = type.Substring(0, type.Length - 6);  //strip "BitExt"

            Console.WriteLine("[{0}] {1}", type, message);
        }
Beispiel #5
0
        public DebugReport(Instance instance, VkDebugReportFlagsEXT flags = VkDebugReportFlagsEXT.ErrorEXT | VkDebugReportFlagsEXT.WarningEXT)
        {
            inst = instance;

            VkDebugReportCallbackCreateInfoEXT dbgInfo = new VkDebugReportCallbackCreateInfoEXT {
                sType       = VkStructureType.DebugReportCallbackCreateInfoEXT,
                flags       = flags,
                pfnCallback = Marshal.GetFunctionPointerForDelegate(debugCallbackDelegate)
            };

            Utils.CheckResult(vkCreateDebugReportCallbackEXT(inst.Handle, ref dbgInfo, IntPtr.Zero, out handle));
        }
        public void EnableDebugCallback(VkDebugReportFlagsEXT flags = VkDebugReportFlagsEXT.WarningEXT | VkDebugReportFlagsEXT.ErrorEXT)
        {
            _debugCallbackFunc = DebugCallback;
            IntPtr debugFunctionPtr = Marshal.GetFunctionPointerForDelegate(_debugCallbackFunc);
            VkDebugReportCallbackCreateInfoEXT debugCallbackCI = VkDebugReportCallbackCreateInfoEXT.New();

            debugCallbackCI.flags       = flags;
            debugCallbackCI.pfnCallback = debugFunctionPtr;
            FixedUtf8String debugExtFnName = "vkCreateDebugReportCallbackEXT";
            IntPtr          createFnPtr    = vkGetInstanceProcAddr(_instance, debugExtFnName);
            vkCreateDebugReportCallbackEXT_d createDelegate = Marshal.GetDelegateForFunctionPointer <vkCreateDebugReportCallbackEXT_d>(createFnPtr);

            createDelegate(_instance, &debugCallbackCI, IntPtr.Zero, out _debugCallbackHandle);
        }
Beispiel #7
0
        private static VkBool32 DebugCallback(
            VkDebugReportFlagsEXT flags,
            VkDebugReportObjectTypeEXT objType,
            ulong obj,
            IntPtr location,
            int code,
            IntPtr layerPrefix,
            IntPtr msg,
            IntPtr userData)
        {
            var message = Marshal.PtrToStringAnsi(msg);

            Console.WriteLine($"Validation layer: {message}");
            return(VkDefines.VK_FALSE);
        }
Beispiel #8
0
        static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, ulong obj,
                                      UIntPtr location, int messageCode, IntPtr pLayerPrefix, IntPtr pMessage, IntPtr pUserData)
        {
            string prefix = "";

            switch (flags)
            {
            case 0:
                prefix = "?";
                break;

            case VkDebugReportFlagsEXT.InformationEXT:
                Console.ForegroundColor = ConsoleColor.Gray;
                prefix = "INFO";
                break;

            case VkDebugReportFlagsEXT.WarningEXT:
                Console.ForegroundColor = ConsoleColor.DarkYellow;
                prefix = "WARN";
                break;

            case VkDebugReportFlagsEXT.PerformanceWarningEXT:
                Console.ForegroundColor = ConsoleColor.Yellow;
                prefix = "PERF";
                break;

            case VkDebugReportFlagsEXT.ErrorEXT:
                Console.ForegroundColor = ConsoleColor.DarkRed;
                prefix = "EROR";
                break;

            case VkDebugReportFlagsEXT.DebugEXT:
                Console.ForegroundColor = ConsoleColor.Red;
                prefix = "DBUG";
                break;
            }
            try {
                string   msg = Marshal.PtrToStringAnsi(pMessage);
                string[] tmp = msg.Split('|');
                Console.WriteLine($"{prefix}:{tmp[1]} |{Marshal.PtrToStringAnsi (pLayerPrefix)}({messageCode}){objectType}:{tmp[0]}");
            } catch (Exception ex) {
                Console.WriteLine("error parsing debug message: " + ex);
            }
            Console.ForegroundColor = ConsoleColor.White;
            return(VkBool32.False);
        }
Beispiel #9
0
        public void DebugReportMessageEXT(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, ulong obj, IntPtr location, int messageCode, string layerPrefix,
                                          string message)
        {
            var unmanagedSize =
                layerPrefix.SizeOfMarshalIndirect() +
                message.SizeOfMarshalIndirect();
            var unmanagedArray = new byte[unmanagedSize];

            fixed(byte *unmanagedStart = unmanagedArray)
            {
                var unmanaged    = unmanagedStart;
                var pLayerPrefix = layerPrefix.MarshalIndirect(ref unmanaged);
                var pMessage     = message.MarshalIndirect(ref unmanaged);

                Direct.DebugReportMessageEXT(Handle, flags, objectType, obj, location, messageCode, pLayerPrefix, pMessage);
            }
        }
Beispiel #10
0
        public void EnableDebugCallback(VkDebugReportFlagsEXT flags = VkDebugReportFlagsEXT.WarningEXT | VkDebugReportFlagsEXT.ErrorEXT)
        {
            Debug.WriteLine("Enabling Vulkan Debug callbacks.");
            _debugCallbackFunc = DebugCallback;
            IntPtr debugFunctionPtr = Marshal.GetFunctionPointerForDelegate(_debugCallbackFunc);
            VkDebugReportCallbackCreateInfoEXT debugCallbackCI = VkDebugReportCallbackCreateInfoEXT.New();

            debugCallbackCI.flags       = flags;
            debugCallbackCI.pfnCallback = debugFunctionPtr;
            IntPtr createFnPtr;

            using (FixedUtf8String debugExtFnName = "vkCreateDebugReportCallbackEXT")
            {
                createFnPtr = vkGetInstanceProcAddr(_instance, debugExtFnName);
            }
            vkCreateDebugReportCallbackEXT_d createDelegate = Marshal.GetDelegateForFunctionPointer <vkCreateDebugReportCallbackEXT_d>(createFnPtr);
            VkResult result = createDelegate(_instance, &debugCallbackCI, IntPtr.Zero, out _debugCallbackHandle);

            CheckResult(result);
        }
Beispiel #11
0
        static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, ulong obj,
                                      UIntPtr location, int messageCode, IntPtr pLayerPrefix, IntPtr pMessage, IntPtr pUserData)
        {
            string prefix = "";

            switch (flags)
            {
            case 0:
                prefix = "?";
                break;

            case VkDebugReportFlagsEXT.InformationEXT:
                Console.ForegroundColor = ConsoleColor.Gray;
                prefix = "INFO";
                break;

            case VkDebugReportFlagsEXT.WarningEXT:
                Console.ForegroundColor = ConsoleColor.DarkYellow;
                prefix = "WARN";
                break;

            case VkDebugReportFlagsEXT.PerformanceWarningEXT:
                Console.ForegroundColor = ConsoleColor.Yellow;
                prefix = "PERF";
                break;

            case VkDebugReportFlagsEXT.ErrorEXT:
                Console.ForegroundColor = ConsoleColor.DarkRed;
                prefix = "EROR";
                break;

            case VkDebugReportFlagsEXT.DebugEXT:
                Console.ForegroundColor = ConsoleColor.Red;
                prefix = "DBUG";
                break;
            }

            Console.WriteLine("{0} {1}: {2}", prefix, messageCode, Marshal.PtrToStringAnsi(pMessage));
            Console.ForegroundColor = ConsoleColor.White;
            return(VkBool32.False);
        }
        private static bool DebugReport(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, ulong @object, nuint location, int messageCode, string layerPrefix, string message, IntPtr userData)
        {
            string debugMessage = $"{flags}, {@object}, {location}: {message} ([{messageCode}] {layerPrefix})";

            switch (GraphicsAdapterFactory.adapterFlags)
            {
            default:
                Debug.WriteLine(debugMessage);
                return(false);

            case DeviceCreationFlags.DebugAndBreak:
                Debug.WriteLine(debugMessage);
                Debugger.Break();
                return(false);

            case DeviceCreationFlags.DebugAndBreakUnique:
                int    start = message.IndexOf("[ ");
                int    end   = message.IndexOf(" ]");
                string key   = message.Substring(start, end - start);
                if (ErrorsAlready.TryGetValue(key, out _) == false)
                {
                    ErrorsAlready[key] = true;
                    Debug.WriteLine(debugMessage);
                    Debugger.Break();
                }
                return(false);

            case DeviceCreationFlags.DebugAndLogUnique:
                start = message.IndexOf("[ ");
                end   = message.IndexOf(" ]");
                key   = message.Substring(start, end - start);
                if (ErrorsAlready.TryGetValue(key, out _) == false)
                {
                    ErrorsAlready[key] = true;
                    debugMessage      += "\n\nStack Trace: " + (new StackTrace()).ToString();
                    ErrorFileLogger.WriteLogToFile(debugMessage);
                }
                return(false);
            }
        }
        internal DebugReportCallbackExt(VkInstance parent, VkDebugReportFlagsEXT flags,
                                        Func <DebugReportCallbackInfo, bool> callback, IntPtr userData = default(IntPtr))
        {
            Parent = parent;

            Func <DebugReportCallbackInfo, bool> createInfoCallback = callback;
            IntPtr callbackHandle = IntPtr.Zero;

            if (createInfoCallback != null)
            {
                _callback = (flags, objectType, @object, location, messageCode, layerPrefix, message, userData)
                            => createInfoCallback(new DebugReportCallbackInfo
                {
                    Flags       = flags,
                    ObjectType  = objectType,
                    Object      = @object,
                    Location    = location,
                    MessageCode = messageCode,
                    LayerPrefix = Utilities.FromPointer(layerPrefix),
                    Message     = Utilities.FromPointer(message),
                    UserData    = userData
                });
                callbackHandle = Marshal.GetFunctionPointerForDelegate(_callback);
            }

            var nativeCreateInfo = new VkDebugReportCallbackCreateInfoEXT
            {
                sType       = VkStructureType.DebugReportCallbackCreateInfoEXT,
                flags       = flags,
                pfnCallback = callbackHandle,
                pUserData   = (void *)userData
            };

            long     handle;
            VkResult result = vkCreateDebugReportCallbackEXT(Parent)(Parent.Handle, &nativeCreateInfo, null, &handle);

            this.handle = (ulong)handle;
        }
 private static VkBool32 DebugReport(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, ulong @object, VkPointerSize location, int messageCode, string layerPrefix, string message, IntPtr userData)
 {
     Debug.WriteLine($"{flags}: {message} ([{messageCode}] {layerPrefix})");
     return(false);
 }