#gl #function #pointers #load #loaded #opengl #loading-calling

no-std gl_struct_loader

用于加载/调用 GL 函数的结构体

2 个版本

0.1.1 2023 年 2 月 23 日
0.1.0 2023 年 2 月 23 日

#857 in 图形 API


2 个 Crates 中使用 (通过 ezgl)

Zlib OR Apache-2.0 OR MIT

385KB
6.5K SLoC

gl_struct_loader

用于加载/调用 GL 函数的结构体


lib.rs:

包含一个可以加载 GL 函数指针并允许调用它们的结构的库。

此库支持

  • 所有 "Core" 配置文件中的 OpenGL 函数,最高到 4.6 (api="gl")
  • 所有从 2.0 到 3.2 的 OpenGL ES 函数 (api="gles2")
  • GL_KHR_debug 扩展 (它是 OpenGL 4.3 和 OpenGL ES 3.2 的核心部分,但在早期版本中必须作为扩展使用)。

典型初始化

let gl = {
  let user_loader = |name| unimplemented!("call some OS fn here");
  let mut gl = GlFns::new_boxed();
  unsafe { gl.load(user_loader) };
  gl
};

new_boxed 函数在堆上直接创建结构体(它相当大,不能保持在栈上),需要库的 alloc 功能(默认开启)。如果您无法使用 alloc 库但仍想使用 GL,可以使用 BLANK_GL_FNS 常量来创建结构的空值。

全局 GL

如果您想在任何地方调用 GL API(例如在 C 程序中),仍然可以使用这个库,尽管我必须承认这有点笨拙。

当库的 std 功能(默认开启)启用时,有一个名为 [GL] 的静态 RwLock 可用。

unsafe {
  // Grab a write lock to load the functions
  GL.write().unwrap().load(|name| core::ptr::null());

  // Then a read lock lets you call the functions
  GL.read().unwrap().ClearColor(1.0, 0.0, 0.5, 1.0);
}

但是,您可以使用它来封装并隐藏 GL API 的不安全性,也可以隐藏锁定和所有那些,所以在实践中还不错。

已加载的内容

如果您尝试调用未加载的函数,将会导致 panic。

如果您想检查一个函数是否已加载,您可以调用 has_loaded 方法(提供一个 FnLoadedChecker)然后是您想检查状态的那个方法。

let gl = BLANK_GL_FNS;
assert_eq!(gl.has_loaded().ClearColor(), false);

尽管如此,在某些平台上,即使当前上下文的API级别和允许的扩展实际上不允许您合法地调用该函数,一个函数仍然可能被加载。与大多数任何不正确的C API使用一样,实际上这样做是不确定的。

我要特别明确:您应该 调用当前上下文的API级别和扩展列表允许的函数。

依赖项