diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..9568b6c --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,61 @@ +//! OpenGL bindings. +#![deny(clippy::all, clippy::pedantic, missing_docs)] + +use opengl_registry_macros::for_each_opengl_command; + +for_each_opengl_command! { + #[doc = stringify!(_gl_command_)] + #[allow(non_snake_case, clippy::too_many_arguments)] + pub unsafe fn _gl_command_(_gl_command_args_) -> _gl_command_ret_type_ { + type GLFunc = + unsafe extern "C" fn(_gl_command_arg_types_) -> _gl_command_ret_type_; + + let gl_func = std::mem::transmute::<_, GLFunc>(functions::_gl_command_); + + gl_func(_gl_command_arg_names_) + } +} + +mod ffi +{ + #![allow( + non_upper_case_globals, + non_camel_case_types, + non_snake_case, + unused, + missing_docs, + clippy::unreadable_literal + )] + + include!(concat!(env!("OUT_DIR"), "/bindings.rs")); +} + +pub use ffi::*; + +/// Loads OpenGL function pointers using the given function address retriever function. +pub fn load_with<GetProcAddrFn>(get_proc_addr: GetProcAddrFn) +where + GetProcAddrFn: Fn(&str) -> unsafe extern "C" fn(), +{ + for_each_opengl_command! { + unsafe { + functions::_gl_command_ = get_proc_addr(stringify!(_gl_command_)); + } + }; +} + +mod functions +{ + use opengl_registry_macros::for_each_opengl_command; + + for_each_opengl_command!( + #[doc = stringify!(_gl_command_)] + #[allow(non_upper_case_globals)] + pub static mut _gl_command_: unsafe extern "C" fn() = function_not_loaded; + ); + + extern "C" fn function_not_loaded() + { + panic!("OpenGL function not loaded"); + } +} |