#![crate_name = "gbm_rs"]
#![crate_type = "lib"]
extern crate libc;
use std::os::unix::prelude::*;
use libc::{
c_int,
c_void,
uint32_t,
uint64_t,
size_t,
};
pub struct Device {
ptr: *const gbm_device
}
impl Device {
pub fn from_fd(fd: RawFd) -> Option<Device> {
unsafe {
let dev = gbm_create_device(fd);
if dev.is_null() {
return None;
}
return Some(Device { ptr: dev });
}
}
pub fn is_format_supported(&self, format: u32, usage: u32) -> bool {
unsafe { gbm_device_is_format_supported(self.ptr, format, usage) != 0 }
}
pub fn fd(&self) -> RawFd {
unsafe { gbm_device_get_fd(self.ptr) }
}
pub fn c_struct(&self) -> *const gbm_device {
self.ptr
}
}
impl Drop for Device {
fn drop(&mut self) {
unsafe { gbm_device_destroy(self.ptr) }
}
}
pub struct Surface {
ptr: *const gbm_surface
}
impl Surface {
pub fn new(dev: &Device, width: u32, height: u32,
format: u32, flags: u32) -> Option<Surface> {
unsafe {
let surf = gbm_surface_create(dev.ptr, width, height,
format, flags);
if surf.is_null() {
return None;
}
return Some(Surface { ptr: surf });
}
}
pub fn has_free_buffers(&self) -> bool {
unsafe { gbm_surface_has_free_buffers(self.ptr) != 0 }
}
pub fn lock_front_buffer(&self) -> Option<BufferObject> {
unsafe {
let bo = gbm_surface_lock_front_buffer(self.ptr);
if bo.is_null() {
return None;
}
return Some(BufferObject { ptr: bo, manual: false });
}
}
pub fn release_buffer(&self, bo: BufferObject) {
unsafe { gbm_surface_release_buffer(self.ptr, bo.ptr) }
}
pub fn c_struct(&self) -> *const gbm_surface {
self.ptr
}
}
impl Drop for Surface {
fn drop(&mut self) {
unsafe { gbm_surface_destroy(self.ptr) }
}
}
pub struct BufferObject {
ptr: *const gbm_bo,
manual: bool,
}
impl BufferObject {
pub fn new(dev: &Device, width: u32, height: u32,
format: u32, flags: u32) -> Option<BufferObject> {
unsafe {
let bo = gbm_bo_create(dev.ptr, width, height,
format, flags);
if bo.is_null() {
return None;
}
return Some(BufferObject { ptr: bo, manual: true });
}
}
pub fn width(&self) -> u32 {
unsafe { gbm_bo_get_width(self.ptr) }
}
pub fn height(&self) -> u32 {
unsafe { gbm_bo_get_height(self.ptr) }
}
pub fn stride(&self) -> u32 {
unsafe { gbm_bo_get_stride(self.ptr) }
}
pub fn format(&self) -> u32 {
unsafe { gbm_bo_get_format(self.ptr) }
}
pub fn device(&self) -> Device {
unsafe { Device { ptr: gbm_bo_get_device(self.ptr) } }
}
pub fn handle_u32(&self) -> u32 {
unsafe { gbm_bo_get_handle(self.ptr) as u32 }
}
pub fn handle_u64(&self) -> u64 {
unsafe { gbm_bo_get_handle(self.ptr) }
}
pub fn handle_i32(&self) -> i32 {
unsafe { gbm_bo_get_handle(self.ptr) as i32 }
}
pub fn handle_i64(&self) -> i64 {
unsafe { gbm_bo_get_handle(self.ptr) as i64 }
}
pub fn handle_ptr(&self) -> *const c_void {
unsafe { gbm_bo_get_handle(self.ptr) as *const c_void }
}
pub fn fd(&self) -> RawFd {
unsafe { gbm_bo_get_fd(self.ptr) }
}
pub fn write<T>(&self, buf: *const T, count: usize) -> bool {
unsafe { gbm_bo_write(self.ptr, buf as *const c_void, count) == 0 }
}
pub fn c_struct(&self) -> *const gbm_bo {
self.ptr
}
}
impl Drop for BufferObject {
fn drop(&mut self) {
unsafe { if self.manual { gbm_bo_destroy(self.ptr) } }
}
}
pub const USE_SCANOUT: u32 = (1 << 0);
pub const USE_CURSOR: u32 = (1 << 1);
pub const USE_RENDERING: u32 = (1 << 2);
pub const USE_WRITE: u32 = (1 << 3);
pub mod format {
macro_rules! fourcc_code {
($a:expr, $b:expr, $c:expr, $d:expr) => {
($a as u32) | (($b as u32) << 8) | (($c as u32) << 16) | (($d as u32) << 24)
}
}
pub const C8: u32 = fourcc_code!('C', '8', ' ', ' ');
pub const RGB332: u32 = fourcc_code!('R', 'G', 'B', '8');
pub const BGR233: u32 = fourcc_code!('B', 'G', 'R', '8');
pub const XRGB4444: u32 = fourcc_code!('X', 'R', '1', '2');
pub const XBGR4444: u32 = fourcc_code!('X', 'B', '1', '2');
pub const RGBX4444: u32 = fourcc_code!('R', 'X', '1', '2');
pub const BGRX4444: u32 = fourcc_code!('B', 'X', '1', '2');
pub const ARGB4444: u32 = fourcc_code!('A', 'R', '1', '2');
pub const ABGR4444: u32 = fourcc_code!('A', 'B', '1', '2');
pub const RGBA4444: u32 = fourcc_code!('R', 'A', '1', '2');
pub const BGRA4444: u32 = fourcc_code!('B', 'A', '1', '2');
pub const XRGB1555: u32 = fourcc_code!('X', 'R', '1', '5');
pub const XBGR1555: u32 = fourcc_code!('X', 'B', '1', '5');
pub const RGBX5551: u32 = fourcc_code!('R', 'X', '1', '5');
pub const BGRX5551: u32 = fourcc_code!('B', 'X', '1', '5');
pub const ARGB1555: u32 = fourcc_code!('A', 'R', '1', '5');
pub const ABGR1555: u32 = fourcc_code!('A', 'B', '1', '5');
pub const RGBA5551: u32 = fourcc_code!('R', 'A', '1', '5');
pub const BGRA5551: u32 = fourcc_code!('B', 'A', '1', '5');
pub const RGB565: u32 = fourcc_code!('R', 'G', '1', '6');
pub const BGR565: u32 = fourcc_code!('B', 'G', '1', '6');
pub const RGB888: u32 = fourcc_code!('R', 'G', '2', '4');
pub const BGR888: u32 = fourcc_code!('B', 'G', '2', '4');
pub const XRGB8888: u32 = fourcc_code!('X', 'R', '2', '4');
pub const XBGR8888: u32 = fourcc_code!('X', 'B', '2', '4');
pub const RGBX8888: u32 = fourcc_code!('R', 'X', '2', '4');
pub const BGRX8888: u32 = fourcc_code!('B', 'X', '2', '4');
pub const ARGB8888: u32 = fourcc_code!('A', 'R', '2', '4');
pub const ABGR8888: u32 = fourcc_code!('A', 'B', '2', '4');
pub const RGBA8888: u32 = fourcc_code!('R', 'A', '2', '4');
pub const BGRA8888: u32 = fourcc_code!('B', 'A', '2', '4');
pub const XRGB2101010: u32 = fourcc_code!('X', 'R', '3', '0');
pub const XBGR2101010: u32 = fourcc_code!('X', 'B', '3', '0');
pub const RGBX1010102: u32 = fourcc_code!('R', 'X', '3', '0');
pub const BGRX1010102: u32 = fourcc_code!('B', 'X', '3', '0');
pub const ARGB2101010: u32 = fourcc_code!('A', 'R', '3', '0');
pub const ABGR2101010: u32 = fourcc_code!('A', 'B', '3', '0');
pub const RGBA1010102: u32 = fourcc_code!('R', 'A', '3', '0');
pub const BGRA1010102: u32 = fourcc_code!('B', 'A', '3', '0');
pub const YUYV: u32 = fourcc_code!('Y', 'U', 'Y', 'V');
pub const YVYU: u32 = fourcc_code!('Y', 'V', 'Y', 'U');
pub const UYVY: u32 = fourcc_code!('U', 'Y', 'V', 'Y');
pub const VYUY: u32 = fourcc_code!('V', 'Y', 'U', 'Y');
pub const AYUV: u32 = fourcc_code!('A', 'Y', 'U', 'V');
pub const NV12: u32 = fourcc_code!('N', 'V', '1', '2');
pub const NV21: u32 = fourcc_code!('N', 'V', '2', '1');
pub const NV16: u32 = fourcc_code!('N', 'V', '1', '6');
pub const NV61: u32 = fourcc_code!('N', 'V', '6', '1');
}
#[allow(non_camel_case_types)]
pub enum gbm_device {}
#[allow(non_camel_case_types)]
pub enum gbm_bo {}
#[allow(non_camel_case_types)]
pub enum gbm_surface {}
#[link(name = "gbm")]
extern {
fn gbm_device_get_fd(gbm: *const gbm_device) -> c_int;
fn gbm_device_is_format_supported(gbm: *const gbm_device,
format: uint32_t, usage: uint32_t) -> c_int;
fn gbm_device_destroy(gbm: *const gbm_device);
fn gbm_create_device(fd: c_int) -> *const gbm_device;
fn gbm_bo_create(gbm: *const gbm_device,
width: uint32_t, height:
uint32_t, format: uint32_t, flags: uint32_t) -> *const gbm_bo;
fn gbm_bo_get_width(bo: *const gbm_bo) -> uint32_t;
fn gbm_bo_get_height(bo: *const gbm_bo) -> uint32_t;
fn gbm_bo_get_stride(bo: *const gbm_bo) -> uint32_t;
fn gbm_bo_get_format(bo: *const gbm_bo) -> uint32_t;
fn gbm_bo_get_device(bo: *const gbm_bo) -> *const gbm_device;
fn gbm_bo_get_handle(bo: *const gbm_bo) -> uint64_t;
fn gbm_bo_get_fd(bo: *const gbm_bo) -> c_int;
fn gbm_bo_write(bo: *const gbm_bo, buf: *const c_void, count: size_t) -> c_int;
fn gbm_bo_destroy(bo: *const gbm_bo);
fn gbm_surface_create(gbm: *const gbm_device,
width: uint32_t, height: uint32_t,
format: uint32_t, flags: uint32_t) -> *const gbm_surface;
fn gbm_surface_lock_front_buffer(surface: *const gbm_surface) -> *const gbm_bo;
fn gbm_surface_release_buffer(surface: *const gbm_surface, bo: *const gbm_bo);
fn gbm_surface_has_free_buffers(surface: *const gbm_surface) -> c_int;
fn gbm_surface_destroy(surface: *const gbm_surface);
}