virglrenderer 0.1.4

Safe and idiomatic Rust wrapper for virglrenderer
Documentation
pub use virglrenderer_sys::{
    VIRGL_RENDERER_ASYNC_FENCE_CB, VIRGL_RENDERER_DRM, VIRGL_RENDERER_NO_VIRGL,
    VIRGL_RENDERER_RENDER_SERVER, VIRGL_RENDERER_THREAD_SYNC, VIRGL_RENDERER_USE_EGL,
    VIRGL_RENDERER_USE_EXTERNAL_BLOB, VIRGL_RENDERER_USE_GLES, VIRGL_RENDERER_USE_GLX,
    VIRGL_RENDERER_USE_SURFACELESS, VIRGL_RENDERER_VENUS,
};

#[derive(Copy, Clone)]
pub struct VirglRendererFlags(u32);

impl VirglRendererFlags {
    pub fn new() -> Self {
        VirglRendererFlags(0)
    }

    fn set_flag(self, bit: u32, enabled: bool) -> Self {
        VirglRendererFlags(if enabled { self.0 | bit } else { self.0 & !bit })
    }

    pub fn use_virgl(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_NO_VIRGL, !v)
    }

    pub fn use_venus(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_VENUS, v)
    }

    pub fn use_drm(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_DRM, v)
    }

    pub fn use_egl(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_USE_EGL, v)
    }

    pub fn use_thread_sync(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_THREAD_SYNC, v)
    }

    pub fn use_glx(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_USE_GLX, v)
    }

    pub fn use_surfaceless(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_USE_SURFACELESS, v)
    }

    pub fn use_gles(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_USE_GLES, v)
    }

    pub fn use_external_blob(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_USE_EXTERNAL_BLOB, v)
    }

    pub fn use_async_fence_cb(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_ASYNC_FENCE_CB, v)
    }

    pub fn use_render_server(self, v: bool) -> Self {
        self.set_flag(VIRGL_RENDERER_RENDER_SERVER, v)
    }

    pub fn bits(self) -> u32 {
        self.0
    }
}

impl Default for VirglRendererFlags {
    fn default() -> Self {
        VirglRendererFlags::new()
            .use_virgl(true)
            .use_venus(false)
            .use_egl(true)
            .use_surfaceless(true)
            .use_gles(true)
            .use_external_blob(true)
            .use_async_fence_cb(true)
            .use_thread_sync(true)
            .use_render_server(false)
    }
}

impl From<VirglRendererFlags> for u32 {
    fn from(flags: VirglRendererFlags) -> Self {
        flags.bits()
    }
}

impl From<VirglRendererFlags> for i32 {
    fn from(flags: VirglRendererFlags) -> Self {
        flags.bits() as i32
    }
}

impl std::fmt::Debug for VirglRendererFlags {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "VirglRendererFlags({:#010x})", self.0)
    }
}