1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use crate::uses::*;

pub enum DebugLevel {
	High = 0,
	Medium = 1,
	Low = 2,
	All = 3,
}

pub fn EnableDebugContext(level: DebugLevel) {
	static mut LEVEL: u32 = 0;
	unsafe {
		LEVEL = level as u32;
	}
	GLEnable!(DEBUG_OUTPUT, DEBUG_OUTPUT_SYNCHRONOUS);
	GLCheck!(gl::DebugMessageCallback(Some(debug_gl_printer), &LEVEL as *const u32 as *const GLvoid));
}

extern "system" fn debug_gl_printer(src: GLenum, typ: GLenum, id: u32, lvl: GLenum, _: i32, msg: *const i8, filter: *mut GLvoid) {
	let f = unsafe { *(filter as *mut u32) };
	let lvl = match lvl {
		gl::DEBUG_SEVERITY_HIGH => "HIG".into(),
		gl::DEBUG_SEVERITY_MEDIUM => {
			if f > 0 {
				return;
			}
			"MED".into()
		}
		gl::DEBUG_SEVERITY_LOW => {
			if f > 1 {
				return;
			}
			"LOW".into()
		}
		gl::DEBUG_SEVERITY_NOTIFICATION => {
			if f > 2 {
				return;
			}
			"TIP".into()
		}
		_ => conc!("SEVERITY_?_", &lvl.to_string()),
	};

	let src = match src {
		gl::DEBUG_SOURCE_API => "SOURCE_API".into(),
		gl::DEBUG_SOURCE_WINDOW_SYSTEM => "SOURCE_WINDOW_SYSTEM".into(),
		gl::DEBUG_SOURCE_SHADER_COMPILER => "SOURCE_SHADER_COMPILER".into(),
		gl::DEBUG_SOURCE_THIRD_PARTY => "SOURCE_THIRD_PARTY".into(),
		gl::DEBUG_SOURCE_APPLICATION => "SOURCE_APPLICATION".into(),
		gl::DEBUG_SOURCE_OTHER => "SOURCE_OTHER".into(),
		_ => conc!("SOURCE_?_", &src.to_string()),
	};

	let typ = match typ {
		gl::DEBUG_TYPE_ERROR => "TYPE_ERROR".into(),
		gl::DEBUG_TYPE_DEPRECATED_BEHAVIOR => "TYPE_DEPRECATED_BEHAVIOR".into(),
		gl::DEBUG_TYPE_UNDEFINED_BEHAVIOR => "TYPE_UNDEFINED_BEHAVIOR".into(),
		gl::DEBUG_TYPE_PORTABILITY => "TYPE_PORTABILITY".into(),
		gl::DEBUG_TYPE_PERFORMANCE => "TYPE_PERFORMANCE".into(),
		gl::DEBUG_TYPE_MARKER => "TYPE_MARKER".into(),
		gl::DEBUG_TYPE_PUSH_GROUP => "TYPE_PUSH_GROUP".into(),
		gl::DEBUG_TYPE_POP_GROUP => "TYPE_POP_GROUP".into(),
		gl::DEBUG_TYPE_OTHER => "TYPE_OTHER".into(),
		_ => conc!("TYPE_?_", &typ.to_string()),
	};

	WARN!(
		"GLDBG_{}, {}: {} {} {}",
		id,
		lvl,
		typ,
		src,
		unsafe { std::ffi::CStr::from_ptr(msg) }.to_str().unwrap_or("failed to parse utf8")
	);
}