use std::error::Error;
use std::{mem, fmt, cmp, hash};
use {memory, mapping};
use Resources;
#[derive(Debug)]
pub struct Raw<R: Resources> {
resource: R::Buffer,
info: Info,
mapping: Option<mapping::Raw<R>>,
}
impl<R: Resources> Raw<R> {
#[doc(hidden)]
pub fn new(resource: R::Buffer,
info: Info,
mapping: Option<R::Mapping>) -> Self {
Raw {
resource: resource,
info: info,
mapping: mapping.map(|m| mapping::Raw::new(m)),
}
}
#[doc(hidden)]
pub fn resource(&self) -> &R::Buffer { &self.resource }
pub fn get_info(&self) -> &Info { &self.info }
pub fn is_mapped(&self) -> bool {
self.mapping.is_some()
}
#[doc(hidden)]
pub fn mapping(&self) -> Option<&mapping::Raw<R>> {
self.mapping.as_ref()
}
#[doc(hidden)]
pub unsafe fn len<T>(&self) -> usize {
assert!(mem::size_of::<T>() != 0, "Cannot determine the length of zero-sized buffers.");
self.get_info().size / mem::size_of::<T>()
}
}
impl<R: Resources + cmp::PartialEq> cmp::PartialEq for Raw<R> {
fn eq(&self, other: &Self) -> bool {
self.resource().eq(other.resource())
}
}
impl<R: Resources + cmp::Eq> cmp::Eq for Raw<R> {}
impl<R: Resources + hash::Hash> hash::Hash for Raw<R> {
fn hash<H: hash::Hasher>(&self, state: &mut H) {
self.resource().hash(state);
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[repr(u8)]
pub enum Role {
Vertex,
Index,
Constant,
Staging,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub struct Info {
pub role: Role,
pub usage: memory::Usage,
pub bind: memory::Bind,
pub size: usize,
pub stride: usize,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum CreationError {
UnsupportedBind(memory::Bind),
Other,
UnsupportedUsage(memory::Usage),
}
impl fmt::Display for CreationError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
CreationError::UnsupportedBind(ref bind) => write!(f, "{}: {:?}", self.description(), bind),
CreationError::UnsupportedUsage(usage) => write!(f, "{}: {:?}", self.description(), usage),
_ => write!(f, "{}", self.description()),
}
}
}
impl Error for CreationError {
fn description(&self) -> &str {
match *self {
CreationError::UnsupportedBind(_) => "Bind flags are not supported",
CreationError::Other => "An unknown error occurred",
CreationError::UnsupportedUsage(_) => "Requested memory usage mode is not supported",
}
}
}