//! 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_name)] #[allow(non_snake_case, clippy::too_many_arguments)] pub unsafe fn #gl_command_name_noprefix(#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_name); 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(get_proc_addr: GetProcAddrFn) where GetProcAddrFn: Fn(&str) -> unsafe extern "C" fn(), { for_each_opengl_command! { unsafe { functions::#gl_command_name = get_proc_addr(stringify!(#gl_command_name)); } }; } mod functions { use opengl_registry_macros::for_each_opengl_command; for_each_opengl_command!( #[doc = stringify!(#gl_command_name)] #[allow(non_upper_case_globals)] pub static mut #gl_command_name: unsafe extern "C" fn() = function_not_loaded; ); extern "C" fn function_not_loaded() { panic!("OpenGL function not loaded"); } }