use strings; use trace; use types::c; use gl::*; export fn get_string(name: gl_enum) str = { match (glGetString(name)) { case null => return ""; case let s: *const u8 => return c::tostr(s: *const c::char)!; }; }; export fn buffer_data( target: gl_enum, data: []opaque, itemsz: size, usage: gl_enum, ) void = { glBufferData( target, (len(data) * itemsz): uintptr, data: nullable *[*]u8: nullable *opaque, usage, ); }; export fn compile_shader_src(type_: gl_enum, src: str) uint = { const shader = glCreateShader(type_); glShaderSource( shader, 1, &(strings::toutf8(src): *[*]i8: nullable *const i8), &(len(src): i32), ); glCompileShader(shader); let status = 0i32; glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if (status == 0) { let log_len = 0i32; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len); const log_buf = alloc([0u8...], log_len: size); glGetShaderInfoLog( shader, log_len, null, log_buf: *[*]i8: *i8, ); const log = strings::fromutf8(log_buf)!; const type_str = switch (type_) { case GL_VERTEX_SHADER => yield "vertex"; case GL_FRAGMENT_SHADER => yield "fragment"; case GL_GEOMETRY_SHADER => yield "geometry"; case => yield "(unknown)"; }; trace::error(&trace::root, "{} shader compilation failed:\n{}", type_str, log): void; }; return shader; }; export fn link_program(program: uint) void = { glLinkProgram(program); let status = 0i32; glGetProgramiv(program, GL_LINK_STATUS, &status); if (status == 0) { let log_len = 0i32; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len); const log_buf = alloc([0u8...], log_len: size); glGetProgramInfoLog( program, log_len, null, log_buf: *[*]i8: *i8, ); const log = strings::fromutf8(log_buf)!; trace::error(&trace::root, "program linking failed:\n{}", log): void; }; };