7 个不稳定版本
使用旧的 Rust 2015
0.5.0 | 2019 年 10 月 31 日 |
---|---|
0.4.0 | 2017 年 10 月 9 日 |
0.2.1 | 2017 年 1 月 21 日 |
0.1.2 | 2016 年 4 月 2 日 |
#155 在 图形 API 中
339 每月下载次数
用于 fireplace_lib
115KB
1.5K SLoC
EGLI - Rust 的 EGL 接口
概览
extern crate egli;
use egli::{ Display, RenderableType };
fn main() {
let display = Display::from_default_display()
.expect("failed to get EGL display");
display.initialize()
.expect("failed to initialize");
let configs = display.config_filter()
.with_blue_size(8)
.with_red_size(8)
.with_green_size(8)
.with_depth_size(24)
.with_conformant(RenderableType::OPENGL_ES2)
.choose_configs()
.expect("failed to get configurations");
println!("There are {} display configurations", configs.len());
println!("First found configuration matching parameters is: {:#?}",
configs.first());
// proceed to create surface & context ...
}
- 在此处浏览 API 参考。
- 在此处查看 OpenGL 示例(带有 X11 窗口)。
完成了吗?
没有,并且可能需要相当长的时间才能使其达到我们可以称之为“完成”的状态。然而,已经实现的子集应该可以使用,并且不应该有太大变化,除了 egli::ffi
的绑定方式。
一些希望拥有的功能
- 在高级
egli
中提供更完整的 API 覆盖。 - 一种简单的方法来装饰错误结果,以从
eglGetError
获取额外信息。
什么是 EGL
EGL 是 GLX 和 WGL API 的独立于窗口系统的等效物,分别使 OpenGL 在 X 和 Microsoft Windows 中获得支持。它是 Khronos 渲染 API(如 OpenGL ES 或 OpenVG)与底层本地平台窗口系统之间的接口。它处理图形上下文管理、表面/缓冲区绑定、渲染同步,并使其他 Khronos API 能够实现高性能、加速、混合模式的 2D 和 3D 渲染。
为什么使用 EGLI
许多库(如 SDL 或 glutin)已经做了 EGL 所做的(以及更多)。通常它们在幕后使用 EGL。因此,如果直接使用 EGL,只在实际需要时才这样做:
- 您通过其他方式获得了窗口/显示句柄。
- 您需要完全控制表面配置。
- 您需要初始化 OpenGL 上下文。
- 您已经拥有另一个需要调用 EGL 提供的
get_proc_address
的 OpenGL 库。 - 您需要一种在场景结束时交换缓冲区的方法。
EGLI 详细信息
在此处浏览 API 参考。
EGLI 有两个抽象级别。
较低级别的 EGL 可以在 egli::egl
命名空间中找到。高级别类型位于根 egli
命名空间中。
较低级别 EGL 接口
低级别接口非常接近原始的ffi
,但去除了错误处理和不可安全性(除了少数特殊情况)。
高级别 EGL 接口
EGLI 为诸如Surface
、Display
或Context
等概念提供了RAII包装器。这些结构体在文档中明确标记为RAII
,因为当这些结构体超出作用域时,用户必须意识到资源销毁。
此库不尝试保证安全并引用计数字资源。相反,用户必须手动管理销毁顺序。
在下面的示例中,Display
将在作用域结束时最后被销毁。
let display = egli::Display::from_default_display()
.expect("failed to get EGL display");
let surface = display.create_window_surface(config, native_window)
.expect("failed to create surface");
// at the end of scope the surface will be dropped
// and then the display will be dropped
// the resources will be freed in this exact order
如果将显示和表面存储在其他结构体中,必须注意使用与创建相反的顺序。
let window_info = DisplayAndSurface {
surface: surface,
display: display,
};
此外,可以轻松编写一个RC包装器,该包装器根据应用需求处理这些依赖关系。这类事情超出了此库的范围。
使用高级和低级接口
所有RAII
对象都可以直接从句柄创建,并且它们都有返回句柄并禁用RAII
释放功能的forget()
方法。
在下面的示例中,使用低级 EGL 调用来终止显示,而不是作用域结束时的释放。
let display = egli::Display::from_default_display()
.expect("failed to get EGL display");
let display_handle = display.forget();
egli::egl::terminate(display_handle) // display is terminated
.expect("failed to terminate display");
// the display's drop won't run because the forget() was called
许可
许可方式之一
- Apache License,版本 2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
包含受版权保护的作品,版权所有 2015 年Sean Kerr,Apache License,版本 2.0。在此许可下创建的文件可以通过其标题识别。
贡献
除非你明确声明,否则任何有意提交以包含在作品中的贡献,如Apache-2.0许可证中定义,应如上所述双重许可,不附加任何其他条款或条件。
依赖关系
~145KB