hbm 0.1.6

A hardware buffer allocator
Documentation
use drm_fourcc::{DrmFourcc, DrmModifier};
use hbm::{Flags, Format, MemoryType, Usage};
use std::slice;

#[cfg(feature = "drm")]
fn main() {
    env_logger::init();

    let backend = hbm::drm_kms::Builder::new()
        .node_path("/dev/dri/card0")
        .build()
        .unwrap();
    let dev = hbm::Builder::new().add_backend(backend).build().unwrap();

    let bo_desc = hbm::Description::new()
        .flags(Flags::EXTERNAL | Flags::MAP)
        .format(Format(DrmFourcc::Xrgb8888 as u32))
        .modifier(DrmModifier::Linear.into());
    let bo_usage = Usage::DrmKms(hbm::drm_kms::Usage::PRIMARY);
    let bo_class = dev.classify(bo_desc, slice::from_ref(&bo_usage)).unwrap();

    let bo_width = 63;
    let bo_height = 63;
    let mut bo = hbm::Bo::with_constraint(
        dev.clone(),
        &bo_class,
        hbm::Extent::Image(bo_width, bo_height),
        None,
    )
    .unwrap();
    bo.bind_memory(MemoryType::MAPPABLE, None).unwrap();

    let dmabuf = bo.export_dma_buf(Some("test")).unwrap();
    let layout = bo.layout();
    println!(
        "bo size {}x{} alloc {} format {} modifier 0x{:x}",
        bo_width, bo_height, layout.size, bo_desc.format, layout.modifier.0,
    );
    for plane in 0..(layout.plane_count as usize) {
        println!(
            "  plane {}: offset {} stride {}",
            plane, layout.offsets[plane], layout.strides[plane]
        );
    }

    let mut bo2 = hbm::Bo::with_layout(
        dev.clone(),
        &bo_class,
        hbm::Extent::Image(bo_width, bo_height),
        layout,
        None,
    )
    .unwrap();
    bo2.bind_memory(MemoryType::MAPPABLE, Some(dmabuf)).unwrap();

    bo.map().unwrap();
    bo.flush();
    bo.invalidate();
    bo.unmap();
}

#[cfg(not(feature = "drm"))]
fn main() {
    println!("drm feature disabled");
}