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)
}
}