#opengl #gl #graphics #gamedev #top-level

no-std gl46

Bindings to OpenGL 4.6 (plus some extensions)

12 releases

0.2.1 Mar 8, 2021
0.2.0 Feb 21, 2021
0.1.3 Sep 17, 2020
0.1.2 Aug 9, 2020
0.0.2 Jul 19, 2020

#934 in Graphics APIs

Download history 91/week @ 2024-01-29 23/week @ 2024-02-05 20/week @ 2024-02-19 23/week @ 2024-02-26 19/week @ 2024-03-04 30/week @ 2024-03-11 22/week @ 2024-03-18 3/week @ 2024-03-25 97/week @ 2024-04-01 13/week @ 2024-04-08 30/week @ 2024-04-15

145 downloads per month

Zlib OR Apache-2.0 OR MIT

6.5K SLoC

License:Zlib min-rust-1.34 crates.io docs.rs

This Is A Generated Crate

This crate is hand-tuned output from running one of the scripts in the phosphorus repo.

Because of this, PRs to this crate about anything other than the top level crate doucmentation cannot generally be accepted. Instead you should make changes to how phosphorus does its thing.


Bindings to OpenGL 4.6 (plus some extensions)

See the crate documentation for an explanation of the crate's operation.


Makes the OpenGL 4.6 Core API (plus some extensions) available for use.

The crate's interface is provided as a "struct" style loader. Construct a GlFns using an appropriate "gl_get_proc_address" function and then call its methods.


Cargo Features

  • track_caller: Enables the track_caller attribute on any function that can panic. Specifically, the extension functions of the struct loader might not be loaded, and if you call them when they're not loaded you'll get a panic.


GL must generally be dynamically loaded at runtime. This is done via a function which we'll call "gl_get_proc_address". The expected operation of this function is very simple: The caller passes in the pointer to a null-terminated string with the name of a GL function, and gl_get_proc_address returns the pointer to that function.

The way that you get an appropriate gl_get_proc_address function is platform dependent.

The function to create a GLFns takes a &dyn Fn(*const u8) -> *const c_void. Note the &dyn part on the front. In addition to passing a closure to the constructor (|x| { ... }), you generally need to prefix your closure with a & to make it be a &dyn value. Like this:

use gl46::*;
let gl = unsafe { GlFns::load_from(&|u8_ptr| SDL_GL_GetProcAddress(u8_ptr.cast())).unwrap() };

It might seem a little silly, but it genuinely helps keep re-compile times down, and it's just one extra & to write.


This crate does not use the #[inline] attribute. If you want full inlining just turn on Link-Time Optimization in your cargo profile:

lto = "thin"