pub use self::view::{Buffer, BufferAny, BufferMutSlice};
pub use self::view::{BufferSlice, BufferAnySlice};
pub use self::alloc::{Mapping, WriteMapping, ReadMapping, ReadError, CopyError};
pub use self::alloc::{is_buffer_read_supported};
pub use self::fences::Inserter;
#[deprecated(note = "Only here for backwards compatibility")]
pub use self::view::Buffer as BufferView;
#[deprecated(note = "Only here for backwards compatibility")]
pub use self::view::BufferSlice as BufferViewSlice;
#[deprecated(note = "Only here for backwards compatibility")]
pub use self::view::BufferMutSlice as BufferViewMutSlice;
#[deprecated(note = "Only here for backwards compatibility")]
pub use self::view::BufferAny as BufferViewAny;
#[deprecated(note = "Only here for backwards compatibility")]
pub use self::view::BufferAnySlice as BufferViewAnySlice;
use crate::gl;
use std::error::Error;
use std::fmt;
use std::mem;
use std::slice;
mod alloc;
mod fences;
mod view;
pub unsafe trait Content {
type Owned;
unsafe fn read<F, E>(size: usize, _: F) -> Result<Self::Owned, E>
where F: FnOnce(&mut Self) -> Result<(), E>;
fn get_elements_size() -> usize;
fn to_void_ptr(&self) -> *const ();
fn ref_from_ptr<'a>(ptr: *mut (), size: usize) -> Option<*mut Self>;
fn is_size_suitable(_: usize) -> bool;
}
unsafe impl<T> Content for T where T: Copy {
type Owned = T;
#[inline]
unsafe fn read<F, E>(size: usize, f: F) -> Result<T, E> where F: FnOnce(&mut T) -> Result<(), E> {
assert!(size == mem::size_of::<T>());
let mut value = mem::zeroed();
f(&mut value)?;
Ok(value)
}
#[inline]
fn get_elements_size() -> usize {
mem::size_of::<T>()
}
#[inline]
fn to_void_ptr(&self) -> *const () {
self as *const T as *const ()
}
#[inline]
fn ref_from_ptr<'a>(ptr: *mut (), size: usize) -> Option<*mut T> {
if size != mem::size_of::<T>() {
return None;
}
Some(ptr as *mut T)
}
#[inline]
fn is_size_suitable(size: usize) -> bool {
size == mem::size_of::<T>()
}
}
unsafe impl<T> Content for [T] where T: Copy {
type Owned = Vec<T>;
#[inline]
unsafe fn read<F, E>(size: usize, f: F) -> Result<Vec<T>, E>
where F: FnOnce(&mut [T]) -> Result<(), E>
{
assert!(size % mem::size_of::<T>() == 0);
let len = size / mem::size_of::<T>();
let mut value = Vec::with_capacity(len);
value.set_len(len);
f(&mut value)?;
Ok(value)
}
#[inline]
fn get_elements_size() -> usize {
mem::size_of::<T>()
}
#[inline]
fn to_void_ptr(&self) -> *const () {
&self[0] as *const T as *const ()
}
#[inline]
fn ref_from_ptr<'a>(ptr: *mut (), size: usize) -> Option<*mut [T]> {
if size % mem::size_of::<T>() != 0 {
return None;
}
let ptr = ptr as *mut T;
let size = size / mem::size_of::<T>();
Some(unsafe { slice::from_raw_parts_mut(&mut *ptr, size) as *mut [T] })
}
#[inline]
fn is_size_suitable(size: usize) -> bool {
size % mem::size_of::<T>() == 0
}
}
#[derive(Debug, Copy, Clone)]
pub enum BufferCreationError {
OutOfMemory,
BufferTypeNotSupported,
}
impl fmt::Display for BufferCreationError {
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
let desc = match self {
BufferCreationError::OutOfMemory => "Not enough memory to create the buffer",
BufferCreationError::BufferTypeNotSupported => "This type of buffer is not supported",
};
fmt.write_str(desc)
}
}
impl Error for BufferCreationError {}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum BufferMode {
Default,
Dynamic,
Persistent,
Immutable,
}
impl Default for BufferMode {
fn default() -> BufferMode {
BufferMode::Default
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[allow(missing_docs)]
pub enum BufferType {
ArrayBuffer,
PixelPackBuffer,
PixelUnpackBuffer,
UniformBuffer,
CopyReadBuffer,
CopyWriteBuffer,
AtomicCounterBuffer,
DispatchIndirectBuffer,
DrawIndirectBuffer,
QueryBuffer,
ShaderStorageBuffer,
TextureBuffer,
TransformFeedbackBuffer,
ElementArrayBuffer,
}
impl BufferType {
fn to_glenum(&self) -> gl::types::GLenum {
match *self {
BufferType::ArrayBuffer => gl::ARRAY_BUFFER,
BufferType::PixelPackBuffer => gl::PIXEL_PACK_BUFFER,
BufferType::PixelUnpackBuffer => gl::PIXEL_UNPACK_BUFFER,
BufferType::UniformBuffer => gl::UNIFORM_BUFFER,
BufferType::CopyReadBuffer => gl::COPY_READ_BUFFER,
BufferType::CopyWriteBuffer => gl::COPY_WRITE_BUFFER,
BufferType::AtomicCounterBuffer => gl::ATOMIC_COUNTER_BUFFER,
BufferType::DispatchIndirectBuffer => gl::DISPATCH_INDIRECT_BUFFER,
BufferType::DrawIndirectBuffer => gl::DRAW_INDIRECT_BUFFER,
BufferType::QueryBuffer => gl::QUERY_BUFFER,
BufferType::ShaderStorageBuffer => gl::SHADER_STORAGE_BUFFER,
BufferType::TextureBuffer => gl::TEXTURE_BUFFER,
BufferType::TransformFeedbackBuffer => gl::TRANSFORM_FEEDBACK_BUFFER,
BufferType::ElementArrayBuffer => gl::ELEMENT_ARRAY_BUFFER,
}
}
}