Crates.io | gl_generator |
lib.rs | gl_generator |
version | 0.14.0 |
source | src |
created_at | 2014-11-12 18:21:59.03388 |
updated_at | 2019-10-03 10:44:28.795911 |
description | Code generators for creating bindings to the Khronos OpenGL APIs. |
homepage | https://github.com/brendanzab/gl-rs/ |
repository | https://github.com/brendanzab/gl-rs/ |
max_upload_size | |
id | 68 |
size | 123,562 |
Code generators for creating bindings to the Khronos OpenGL APIs.
If you need a specific version of OpenGL, or you need a different API
(OpenGL ES, EGL, WGL, GLX), or if you need certain extensions, you should use
the gl_generator
plugin instead.
See gfx_gl for an example of using a custom gfx-rs loader for a project.
Add this to your Cargo.toml
:
[build-dependencies]
gl_generator = "0.5.0"
Under the [package]
section, add:
build = "build.rs"
Create a build.rs
to pull your specific version/API:
extern crate gl_generator;
use gl_generator::{Registry, Api, Profile, Fallbacks, GlobalGenerator};
use std::env;
use std::fs::File;
use std::path::Path;
fn main() {
let dest = env::var("OUT_DIR").unwrap();
let mut file = File::create(&Path::new(&dest).join("bindings.rs")).unwrap();
Registry::new(Api::Gl, (4, 5), Profile::Core, Fallbacks::All, [])
.write_bindings(GlobalGenerator, &mut file)
.unwrap();
}
Then use it like this:
mod gl {
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
}
/// Simple loading example
fn main() {
let window = ...;
// Assuming `window` is GLFW: initialize, and make current
gl::load_with(|s| window.get_proc_address(s) as *const _);
}
The build.rs
file will generate all the OpenGL functions in a file named,
bindings.rs
plus all enumerations, and all types in the types
submodule.
The global generator is the one used by default by the gl
crate. See above
for more details.
The struct generator is a cleaner alternative to the global generator.
The main difference is that you must call gl::Gl::load_with
instead of
gl::load_with
, and this functions returns a struct of type Gl
. The OpenGL
functions are not static functions but member functions in this Gl
struct.
This is important when the GL functions are associated with the current
context, as is true on Windows.
The enumerations and types are still static and available in a similar way as in the global generator.
The static generator generates plain old bindings. You don't need to load the functions.
This generator should only be used only if the platform you are compiling for is guaranteed to support the requested API. Otherwise you will get a compilation error. For example, you can use it for WGL and OpenGL 1.1 on Windows or GLX and OpenGL 1.3 on Linux, because Windows and Linux are guaranteed to provide implementations for these APIs.
You will need to manually provide the linkage. For example to use WGL or
OpenGL 1.1 on Windows, you will need to add
#[link="OpenGL32.lib"] extern {}
somewhere in your code.
The gl_generator
can be extended with custom generators. This is a niche
feature useful only in very rare cases. To create a custom generator, implement
the gl_generator::Generator
trait. See the source of the
gl_generator::generators
module for examples.
Various utility functions are provided in the generators
module, but the api
is unstable, so it has been placed behind a feature flag. In access these
functions, you will need to add the "unstable_generator_utils"
feature to
your Cargo.toml
:
[build-dependencies.gl_generator]
version = "0.4.2"
features = ["unstable_generator_utils"]
The global and struct generators will attempt to use fallbacks functions when
they are available. For example, if glGenFramebuffers
cannot be loaded it will
also attempt to load glGenFramebuffersEXT
as a fallback.
Ns
to API
, and expose at the top levelkhronos_api
crate by
determining the XML source based on the requested API
(u8, u8)
instead of a string for the target version numberProfile
enum instead of a string for the profileRegistry
AsRef<[&str]>
for extension listsregistry::{Feature, Filter, Require, Remove, Extension}
types from the
public APIregistry::{Fallbacks, Api, Profile}
types to top level moduleGlxOpcode::type
fieldty
fields on Enum
and Binding
take Cow<'static, str>
s to reduce
allocationskhronos_api
to v1.0.0xml-rs
to v0.2.2raw::c_void
for GLvoid
registry::{Group, EnumNs, CmdNs}
groups
field from registry::Registry
is_safe
field from registry::Cmd
comment
field from registry::{Require, Remove, GlxOpcode}
khronos_api
to be a dev-dependency