aboutsummaryrefslogtreecommitdiffstats
path: root/src/debug_gl.zig
blob: 4a145910f09c24d9052492779729c207a551716c (plain)
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
const c = @import("c.zig");
const std = @import("std");
const os = std.os;
const panic = std.debug.panic;
const builtin = @import("builtin");

pub const is_on = if (builtin.mode == .ReleaseFast) c.GL_FALSE else c.GL_TRUE;

fn glDebugMessage(
    source: c.GLenum,
    typ: c.GLenum,
    id: c.GLuint,
    severity: c.GLenum,
    length: c.GLsizei,
    _message: [*c]const u8,
    user: ?*const anyopaque,
) callconv(.C) void {
    _ = id;
    _ = user;

    switch (typ) {
        c.GL_DEBUG_TYPE_ERROR,
        c.GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR,
        c.GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR,
        => {},
        else => return,
    }

    const message = _message[0..@as(usize, @intCast(length))];
    std.debug.print("GL Callback [{}] {} / {}: {s}\n", .{ source, typ, severity, message });
}

pub fn init() void {
    if (is_on == c.GL_TRUE) {
        c.glEnable(c.GL_DEBUG_OUTPUT);
        c.glDebugMessageCallback(glDebugMessage, null);
    }
}

pub fn assertNoError() void {
    if (is_on == c.GL_TRUE) {
        var err = c.glGetError();
        while (err != c.GL_NO_ERROR) : (err = c.glGetError()) {
            panic("GL error: {}\n", .{err});
        } else {
            return;
        }

        panic("GL Errors encountered.\n", .{err});
    }
}