nvidia-omm 0.1.0

Rust bindings for the NVIDIA Opacity Micro-Map CPU baker
Documentation
#![cfg_attr(test, allow(dead_code))]

use {
    crate::{OpacityMicromapDescriptor, OpacityMicromapUsage, Statistics},
    std::ffi::{c_char, c_void},
};

unsafe extern "C" {
    pub(crate) fn nvidia_omm_create(library_path: *const c_char, output: *mut *mut Context) -> i32;
    pub(crate) fn nvidia_omm_destroy(context: *mut Context) -> i32;
    pub(crate) fn nvidia_omm_create_texture(
        context: *mut Context,
        mips: *const TextureMip,
        mip_count: u32,
        output: *mut *mut Texture,
    ) -> i32;
    pub(crate) fn nvidia_omm_destroy_texture(context: *mut Context, texture: *mut Texture) -> i32;
    pub(crate) fn nvidia_omm_bake(
        context: *mut Context,
        input: *const BakeInput,
        output: *mut BakeResult,
        result: *mut *mut c_void,
    ) -> i32;
    pub(crate) fn nvidia_omm_destroy_bake_result(result: *mut c_void) -> i32;
    pub(crate) fn nvidia_omm_result_name(result: i32) -> *const c_char;
}

#[derive(Clone, Copy)]
#[repr(C)]
pub(crate) struct BakeInput {
    pub(crate) texture: *mut Texture,
    pub(crate) texture_coordinates: *const [f32; 2],
    pub(crate) texture_coordinate_count: u32,
    pub(crate) indices: *const u32,
    pub(crate) index_count: u32,
    pub(crate) dynamic_subdivision_scale: f32,
    pub(crate) rejection_threshold: f32,
    pub(crate) max_array_data_size: u32,
    pub(crate) max_workload_size: u64,
    pub(crate) max_subdivision_level: u8,
    pub(crate) internal_threads: u8,
    pub(crate) validation: u8,
    pub(crate) reserved: [u8; 5],
}

#[derive(Clone, Copy)]
#[repr(C)]
pub(crate) struct BakeResult {
    pub(crate) array_data: *const u8,
    pub(crate) array_data_size: u32,
    pub(crate) descriptors: *const OpacityMicromapDescriptor,
    pub(crate) descriptor_count: u32,
    pub(crate) descriptor_usage: *const OpacityMicromapUsage,
    pub(crate) descriptor_usage_count: u32,
    pub(crate) indices: *const i32,
    pub(crate) index_count: u32,
    pub(crate) index_usage: *const OpacityMicromapUsage,
    pub(crate) index_usage_count: u32,
    pub(crate) statistics: Statistics,
}

#[repr(C)]
pub(crate) struct Context {
    _private: [u8; 0],
}

#[repr(C)]
pub(crate) struct Texture {
    _private: [u8; 0],
}

#[derive(Clone, Copy)]
#[repr(C)]
pub(crate) struct TextureMip {
    pub(crate) width: u32,
    pub(crate) height: u32,
    pub(crate) row_pitch: u32,
    pub(crate) reserved: u32,
    pub(crate) data: *const u8,
}

#[cfg(test)]
mod test {
    use {super::*, std::mem::size_of};

    #[test]
    fn native_ffi_layouts_are_stable() {
        assert_eq!(size_of::<BakeInput>(), 64);
        assert_eq!(size_of::<BakeResult>(), 136);
        assert_eq!(size_of::<TextureMip>(), 24);
    }
}