use std::os::unix::io::RawFd;
use egl;
use libgbm;
use cognitive_graphics::attributes::{DmabufAttributes, EglAttributes};
use cognitive_graphics::{gbm_tools, egl_tools};
use qualia::{GraphicsManagement, Illusion};
pub struct GraphicsManager {
_device: libgbm::Device,
display: egl::EGLDisplay,
}
unsafe impl Send for GraphicsManager {}
impl GraphicsManager {
pub fn new(fd: RawFd) -> Result<Self, Illusion> {
let device = gbm_tools::get_device(fd)?;
let display = egl_tools::get_gbm_display(device.c_struct() as egl::EGLNativeDisplayType)?;
let mut major = 0;
let mut minor = 0;
if !egl::initialize(display, &mut major, &mut minor) {
return Err(Illusion::General(format!("Failed to initialize EGL")));
};
if !egl::bind_api(egl::EGL_OPENGL_ES_API) {
return Err(Illusion::General(format!("Failed to bind EGL API")));
};
if egl_tools::has_extension(display, egl_tools::ext::IMAGE_BASE_EXT) {
if egl_tools::get_proc_addr_of_create_image_khr().is_none() {
return Err(Illusion::General(format!("Failed to get function address")));
}
} else {
return Err(Illusion::General(format!("No {} extension",
egl_tools::ext::IMAGE_BASE_EXT)));
}
Ok(GraphicsManager {
_device: device,
display: display,
})
}
}
impl GraphicsManagement for GraphicsManager {
fn create_egl_image(&mut self, attrs: &EglAttributes) -> Option<egl_tools::HwImage> {
egl_tools::create_image(self.display, attrs)
}
fn import_dmabuf(&mut self, attrs: &DmabufAttributes) -> Option<egl_tools::HwImage> {
egl_tools::import_dmabuf(self.display, attrs)
}
fn destroy_hw_image(&mut self, image: egl_tools::HwImage) -> Result<(), ()> {
egl_tools::destroy_image(self.display, image)
}
}