use crate::provider::{ResourceError, ResourceId};
use crate::api::{
extension::{Inheritance, Protections, ProviderId, Sharing},
Version,
};
pub trait Memory: Send + Sync {
fn allocate(&self, request: AllocationRequest) -> Result<HostResource, ResourceError>;
fn import(&self, descriptor: &ResourceDescriptor) -> Result<HostResource, ResourceError>;
fn release(&self, _resource: ResourceId) {}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct AllocationRequest {
pub size: u64,
pub alignment: u64,
pub protections: Protections,
pub sharing: Sharing,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ResourceDescriptor {
pub provider: ProviderId,
pub version: Version,
pub bytes: Vec<u8>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct HostResource {
pub id: ResourceId,
pub regions: Vec<Region>,
pub handles: Vec<TransferHandle>,
pub coherency: Coherency,
pub inheritance: Inheritance,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Region {
pub offset: u64,
pub size: u64,
pub protections: Protections,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct TransferHandle(pub u64);
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Coherency {
Coherent,
Explicit,
}