-
Notifications
You must be signed in to change notification settings - Fork 0
/
debug.go
77 lines (70 loc) · 2.21 KB
/
debug.go
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
76
77
package gll
/*
#include <stdint.h>
void gllCall_glDebugMessageCallback(void *_func, uintptr_t userParam);
*/
import "C"
import (
"runtime"
"sync"
"unsafe"
)
type debugState struct {
debugProc func(source, type_, id, severity uint32, message string)
debugIdx int
}
func (gl *lib) DebugMessageCallback(callback func(source, type_, id, severity uint32, message string)) {
gl.callDebugMessageCallback(gl.glDebugMessageCallback, callback)
}
func (gl *lib) DebugMessageCallbackAMD(callback func(source, type_, id, severity uint32, message string)) {
gl.callDebugMessageCallback(gl.glDebugMessageCallbackAMD, callback)
}
func (gl *lib) DebugMessageCallbackARB(callback func(source, type_, id, severity uint32, message string)) {
gl.callDebugMessageCallback(gl.glDebugMessageCallbackARB, callback)
}
func (gl *lib) DebugMessageCallbackKHR(callback func(source, type_, id, severity uint32, message string)) {
gl.callDebugMessageCallback(gl.glDebugMessageCallbackKHR, callback)
}
func (gl *lib) callDebugMessageCallback(glDebugMessageCallback unsafe.Pointer, callback func(source, type_, id, severity uint32, message string)) {
if gl.debugProc == nil {
gl.debugIdx = debugAdd(gl)
runtime.SetFinalizer(gl, func(gl *lib) {
debugDel(gl.debugIdx)
})
}
gl.debugProc = callback
C.gllCall_glDebugMessageCallback(glDebugMessageCallback, C.uintptr_t(gl.debugIdx))
}
func debugGet(idx int) *lib {
debugLock.RLock()
defer debugLock.RUnlock()
return debugLibs[idx]
}
func debugAdd(gl *lib) int {
debugLock.Lock()
defer debugLock.Unlock()
if len(debugFree) > 0 {
// Grab a free slot
idx := debugFree[len(debugFree)-1]
debugFree = debugFree[:len(debugFree)-1]
return idx
} else {
// Create a new slot
debugLibs = append(debugLibs, gl)
return len(debugLibs) - 1
}
}
func debugDel(idx int) {
debugLock.Lock()
defer debugLock.Unlock()
debugLibs[idx] = nil
debugFree = append(debugFree, idx)
}
var debugLibs []*lib
var debugFree []int
var debugLock sync.RWMutex
//export gllDebugProc
func gllDebugProc(source, type_, id, severity, length C.uint32_t, message *C.char, userParam C.uintptr_t) {
gl := debugGet(int(userParam))
gl.debugProc(uint32(source), uint32(type_), uint32(id), uint32(severity), C.GoStringN(message, C.int(length)))
}