use crate::{device, format, Backend, IndexType};
pub type Offset = u64;
#[derive(Clone, Debug, Default, Hash, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SubRange {
pub offset: Offset,
pub size: Option<Offset>,
}
impl SubRange {
pub const WHOLE: Self = SubRange {
offset: 0,
size: None,
};
pub fn size_to(&self, limit: Offset) -> Offset {
self.size.unwrap_or(limit - self.offset)
}
}
pub type State = Access;
#[derive(Clone, Debug, PartialEq)]
pub enum CreationError {
OutOfMemory(device::OutOfMemory),
UnsupportedUsage {
usage: Usage,
},
}
impl From<device::OutOfMemory> for CreationError {
fn from(error: device::OutOfMemory) -> Self {
CreationError::OutOfMemory(error)
}
}
impl std::fmt::Display for CreationError {
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
CreationError::OutOfMemory(err) => write!(fmt, "Failed to create buffer: {}", err),
CreationError::UnsupportedUsage { usage } => write!(
fmt,
"Failed to create buffer: Unsupported usage: {:?}",
usage
),
}
}
}
impl std::error::Error for CreationError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
CreationError::OutOfMemory(err) => Some(err),
_ => None,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum ViewCreationError {
OutOfMemory(device::OutOfMemory),
UnsupportedFormat(Option<format::Format>),
}
impl From<device::OutOfMemory> for ViewCreationError {
fn from(error: device::OutOfMemory) -> Self {
ViewCreationError::OutOfMemory(error)
}
}
impl std::fmt::Display for ViewCreationError {
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ViewCreationError::OutOfMemory(err) => {
write!(fmt, "Failed to create buffer view: {}", err)
}
ViewCreationError::UnsupportedFormat(Some(format)) => write!(
fmt,
"Failed to create buffer view: Unsupported format {:?}",
format
),
ViewCreationError::UnsupportedFormat(None) => {
write!(fmt, "Failed to create buffer view: Unspecified format")
}
}
}
}
impl std::error::Error for ViewCreationError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
ViewCreationError::OutOfMemory(err) => Some(err),
_ => None,
}
}
}
bitflags!(
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Usage: u32 {
const TRANSFER_SRC = 0x1;
const TRANSFER_DST = 0x2;
const UNIFORM_TEXEL = 0x4;
const STORAGE_TEXEL = 0x8;
const UNIFORM = 0x10;
const STORAGE = 0x20;
const INDEX = 0x40;
const VERTEX = 0x80;
const INDIRECT = 0x100;
}
);
impl Usage {
pub fn can_transfer(&self) -> bool {
self.intersects(Usage::TRANSFER_SRC | Usage::TRANSFER_DST)
}
}
bitflags!(
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Access: u32 {
const INDIRECT_COMMAND_READ = 0x1;
const INDEX_BUFFER_READ = 0x2;
const VERTEX_BUFFER_READ = 0x4;
const UNIFORM_READ = 0x8;
const SHADER_READ = 0x20;
const SHADER_WRITE = 0x40;
const TRANSFER_READ = 0x800;
const TRANSFER_WRITE = 0x1000;
const HOST_READ = 0x2000;
const HOST_WRITE = 0x4000;
const MEMORY_READ = 0x8000;
const MEMORY_WRITE = 0x10000;
}
);
#[derive(Debug)]
pub struct IndexBufferView<'a, B: Backend> {
pub buffer: &'a B::Buffer,
pub range: SubRange,
pub index_type: IndexType,
}