Giter VIP home page Giter VIP logo

khronos-egl's Introduction

Rust bindings for EGL

Documentation Crate informations Repository

This crate provides a binding for the Khronos EGL 1.5 API. It was originally a fork of the egl crate, which is left unmaintained.

Usage

You can access the EGL API using an Instance object defined by either statically linking with libEGL.so at compile time, or dynamically loading the EGL library at runtime.

Static linking

You must enable static linking using the static feature in your Cargo.toml:

khronos-egl = { version = ..., features = ["static"] }

This will add a dependency to the pkg-config crate, necessary to find the EGL library at compile time. Here is a simple example showing how to use this library to create an EGL context when static linking is enabled.

extern crate khronos_egl as egl;

fn main() -> Result<(), egl::Error> {
	// Create an EGL API instance.
	// The `egl::Static` API implementation is only available when the `static` feature is enabled.
	let egl = egl::Instance::new(egl::Static);

	let wayland_display = wayland_client::Display::connect_to_env().expect("unable to connect to the wayland server");
	let display = egl.get_display(wayland_display.get_display_ptr() as *mut std::ffi::c_void).unwrap();
	egl.initialize(display)?;

	let attributes = [
		egl::RED_SIZE, 8,
		egl::GREEN_SIZE, 8,
		egl::BLUE_SIZE, 8,
		egl::NONE
	];

	let config = egl.choose_first_config(display, &attributes)?.expect("unable to find an appropriate ELG configuration");

	let context_attributes = [
		egl::CONTEXT_MAJOR_VERSION, 4,
		egl::CONTEXT_MINOR_VERSION, 0,
		egl::CONTEXT_OPENGL_PROFILE_MASK, egl::CONTEXT_OPENGL_CORE_PROFILE_BIT,
		egl::NONE
	];

	egl.create_context(display, config, None, &context_attributes);

	Ok(())
}

The creation of a Display instance is not detailed here since it depends on your display server. It is created using the get_display function with a pointer to the display server connection handle. For instance, if you are using the wayland-client crate, you can get this pointer using the Display::get_display_ptr method.

Static API Instance

It may be bothering in some applications to pass the Instance to every fonction that needs to call the EGL API. One workaround would be to define a static Instance, which should be possible to define at compile time using static linking. However this is not yet supported by the stable rustc compiler. With the nightly compiler, you can combine the nightly and static features so that this crate can provide a static Instance, called API that can then be accessed everywhere.

use egl::API as egl;

Dynamic Linking

You must enable dynamic linking using the dynamic feature in your Cargo.toml:

khronos-egl = { version = ..., features = ["dynamic"] }

This will add a dependency to the libloading crate, necessary to find the EGL library at runtime. You can then load the EGL API into a Instance<Dynamic<libloading::Library>> as follows:

let lib = libloading::Library::new("libEGL.so").expect("unable to find libEGL.so");
let egl = unsafe { egl::Instance::from_lib(lib).expect("unable to load libEGL.so") };

NixOS

A shell.nix file is present for nix users to build the crate easily. Just enter a new nix shell using the given configuration file, and cargo build should work. If you want to run the tests and examples you will need to use shell-wayland.nix instead that will also load wayland since most of them depend on it.

Testing

Most test and examples most be compiled with the static feature.

Troubleshooting

Static Linking with OpenGL ES

When using OpenGL ES with khronos-egl with the static feature, it is necessary to place a dummy extern at the top of your application which links libEGL first, then GLESv1/2. This is because libEGL provides symbols required by GLESv1/2. Here's how to work around this:

#[link(name = "EGL")]
#[link(name = "GLESv2")]
extern {}

License

Licensed under either of

at your option.

If the original egl crate was licensed only under the Apache 2.0 license, I believe I have made enough breaking changes so that no relevant code from the original code remains and the rest can be relicensed.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

khronos-egl's People

Contributors

proton-decay avatar seankerr avatar timothee-haudebourg avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.