Multi-platform .NET bindings to the Ultralight project.
1using System;
2using System.Diagnostics;
3using Silk.NET.OpenGLES;
4using Silk.NET.OpenGLES.Extensions.KHR;
5
6partial class Program {
7
8 private static KhrDebug? _dbg;
9
10 public static unsafe void EnableDebugExtension() {
11 if (!_gl.TryGetExtension(out KhrDebug dbg)) {
12 Console.Error.WriteLine("Can't enable GL_KHR_debug extension not present.");
13 Console.Error.Flush();
14 return;
15 }
16
17 _gl.Enable(EnableCap.DebugOutput);
18 _gl.Enable(EnableCap.DebugOutputSynchronous);
19
20 Console.WriteLine("GL_KHR_debug extension enabled.");
21
22 dbg.DebugMessageCallback(DebugMessageHandler, default);
23 _dbg = dbg;
24 }
25
26 //private static unsafe void DebugMessageHandler(KHR source, KHR type, int id, KHR severity, int length, IntPtr message, IntPtr param) {
27 private static unsafe void DebugMessageHandler(KHR source, KHR type, int id, KHR severity, int length, IntPtr message, IntPtr param) {
28 var msg = new string((sbyte*) message, 0, length);
29 var fi = 2;
30 var cause = new StackFrame(fi, true);
31 while (cause.GetFileName() == null)
32 cause = new StackFrame(++fi, true);
33
34 var est = new StackTrace(cause);
35
36 var level = (DebugSeverity) severity;
37 var prefixedMsg = $"{level}: {type} ({id}): {msg}\n{est}";
38
39 // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault
40 switch ((DebugType) type) {
41 case DebugType.DebugTypeUndefinedBehavior:
42 case DebugType.DebugTypeDeprecatedBehavior:
43 case DebugType.DebugTypeError: {
44 Console.Error.WriteLine(prefixedMsg);
45 Console.Error.Flush();
46 //Debugger.Break();
47 break;
48 }
49 default: {
50 // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault
51 switch (level) {
52 case DebugSeverity.DebugSeverityNotification:
53 Console.WriteLine(prefixedMsg);
54 break;
55 case DebugSeverity.DebugSeverityLow:
56 Console.WriteLine(prefixedMsg);
57 break;
58 case DebugSeverity.DebugSeverityMedium:
59 Console.Error.WriteLine(prefixedMsg);
60 Console.Error.Flush();
61 break;
62 case DebugSeverity.DebugSeverityHigh:
63 Console.Error.WriteLine(prefixedMsg);
64 Console.Error.Flush();
65 break;
66 default:
67 Console.Error.WriteLine(prefixedMsg);
68 break;
69 }
70
71 break;
72 }
73 case DebugType.DebugTypeMarker:
74 case DebugType.DebugTypePushGroup:
75 case DebugType.DebugTypePopGroup: {
76 Console.WriteLine(prefixedMsg);
77 break;
78 }
79 }
80 }
81
82}