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

Download history 74/week @ 2024-03-11 75/week @ 2024-03-18 42/week @ 2024-03-25 58/week @ 2024-04-01 9/week @ 2024-04-08 23/week @ 2024-04-15 23/week @ 2024-04-22 17/week @ 2024-04-29 81/week @ 2024-05-06 21/week @ 2024-05-13 53/week @ 2024-05-20 65/week @ 2024-05-27 95/week @ 2024-06-03 32/week @ 2024-06-10 100/week @ 2024-06-17 101/week @ 2024-06-24

339 每月下载次数
用于 fireplace_lib

MIT/Apache

115KB
1.5K SLoC

EGLI - Rust 的 EGL 接口

Build Status

概览

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 ...
}

完成了吗?

没有,并且可能需要相当长的时间才能使其达到我们可以称之为“完成”的状态。然而,已经实现的子集应该可以使用,并且不应该有太大变化,除了 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 为诸如SurfaceDisplayContext等概念提供了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

许可

许可方式之一

任选其一。

包含受版权保护的作品,版权所有 2015 年Sean Kerr,Apache License,版本 2.0。在此许可下创建的文件可以通过其标题识别。

贡献

除非你明确声明,否则任何有意提交以包含在作品中的贡献,如Apache-2.0许可证中定义,应如上所述双重许可,不附加任何其他条款或条件。

依赖关系

~145KB