From f9aef43ac2c8dee6562974b3ae7a21a5b4a7bfdf Mon Sep 17 00:00:00 2001 From: Victor Brekenfeld Date: Wed, 22 Apr 2020 22:55:45 +0200 Subject: [PATCH] egl: move loading into separate function --- src/backend/egl/display.rs | 29 +++-------------------------- src/backend/egl/ffi.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/backend/egl/display.rs b/src/backend/egl/display.rs index 2490796..e416299 100644 --- a/src/backend/egl/display.rs +++ b/src/backend/egl/display.rs @@ -8,9 +8,7 @@ use crate::backend::egl::{ }; use std::sync::Arc; -use std::ptr; - -use nix::libc::{c_int, c_void}; +use nix::libc::c_int; #[cfg(feature = "wayland_frontend")] use wayland_server::{protocol::wl_buffer::WlBuffer, Display}; @@ -22,7 +20,7 @@ use crate::backend::egl::context::{GlAttributes, PixelFormatRequirements}; use crate::backend::graphics::gl::ffi as gl_ffi; use crate::backend::graphics::PixelFormat; use std::cell::{Ref, RefCell, RefMut}; -use std::ffi::{CStr, CString}; +use std::ffi::CStr; use std::marker::PhantomData; use std::mem::MaybeUninit; @@ -72,28 +70,7 @@ impl> EGLDisplay { let ptr = native.ptr()?; let egl_attribs = native.attributes(); - ffi::egl::LOAD.call_once(|| unsafe { - fn constrain(f: F) -> F - where - F: for<'a> Fn(&'a str) -> *const ::std::os::raw::c_void, - { - f - }; - - ffi::egl::load_with(|sym| { - let name = CString::new(sym).unwrap(); - let symbol = ffi::egl::LIB.get::<*mut c_void>(name.as_bytes()); - match symbol { - Ok(x) => *x as *const _, - Err(_) => ptr::null(), - } - }); - let proc_address = constrain(|sym| get_proc_address(sym)); - ffi::egl::load_with(&proc_address); - ffi::egl::BindWaylandDisplayWL::load_with(&proc_address); - ffi::egl::UnbindWaylandDisplayWL::load_with(&proc_address); - ffi::egl::QueryWaylandBufferWL::load_with(&proc_address); - }); + ffi::make_sure_egl_is_loaded(); // the first step is to query the list of extensions without any display, if supported let dp_extensions = unsafe { diff --git a/src/backend/egl/ffi.rs b/src/backend/egl/ffi.rs index 042ef9f..ad1e7e8 100644 --- a/src/backend/egl/ffi.rs +++ b/src/backend/egl/ffi.rs @@ -13,6 +13,33 @@ pub type NativeDisplayType = *const c_void; pub type NativePixmapType = *const c_void; pub type NativeWindowType = *const c_void; +pub fn make_sure_egl_is_loaded() { + use std::{ffi::CString, ptr}; + + egl::LOAD.call_once(|| unsafe { + fn constrain(f: F) -> F + where + F: for<'a> Fn(&'a str) -> *const ::std::os::raw::c_void, + { + f + }; + + egl::load_with(|sym| { + let name = CString::new(sym).unwrap(); + let symbol = egl::LIB.get::<*mut c_void>(name.as_bytes()); + match symbol { + Ok(x) => *x as *const _, + Err(_) => ptr::null(), + } + }); + let proc_address = constrain(|sym| super::get_proc_address(sym)); + egl::load_with(&proc_address); + egl::BindWaylandDisplayWL::load_with(&proc_address); + egl::UnbindWaylandDisplayWL::load_with(&proc_address); + egl::QueryWaylandBufferWL::load_with(&proc_address); + }); +} + #[allow(clippy::all, rust_2018_idioms)] pub mod egl { use super::*;