Enum glium::buffer::BufferMode

source ·
pub enum BufferMode {
    Default,
    Dynamic,
    Persistent,
    Immutable,
}
Expand description

How the buffer is created.

Variants§

§

Default

This is the default mode suitable for any usage. Will never be slow, will never be fast either.

Other modes should always be preferred, but you can use this one if you don’t know what will happen to the buffer.

Implementation

Tries to use glBufferStorage with the GL_DYNAMIC_STORAGE_BIT flag.

If this function is not available, falls back to glBufferData with GL_STATIC_DRAW.

§

Dynamic

The mode to use when you modify a buffer multiple times per frame. Similar to Default in that it is suitable for most usages.

Use this if you do a quick succession of modify the buffer, draw, modify, draw, etc. This is something that you shouldn’t do by the way.

With this mode, the OpenGL driver automatically manages the buffer for us. It will try to find the most appropriate storage depending on how we use it. It is guaranteed to never be too slow, but it won’t be too fast either.

Implementation

Tries to use glBufferStorage with the GL_DYNAMIC_STORAGE_BIT and GL_CLIENT_STORAGE_BIT flags.

If this function is not available, falls back to glBufferData with GL_DYNAMIC_DRAW.

§

Persistent

Optimized for when you modify a buffer exactly once per frame. You can modify it more than once per frame, but if you modify it too often things will slow down.

With this mode, glium automatically handles synchronization to prevent the buffer from being access by both the GPU and the CPU simultaneously. If you try to modify the buffer, the execution will block until the GPU has finished using it. For this reason, a quick succession of modifying and drawing using the same buffer will be very slow.

When using persistent mapping, it is recommended to use triple buffering. This is done by creating a buffer that has three times the capacity that it would normally have. You modify and draw the first third, then modify and draw the second third, then the last part, then go back to the first third, etc.

Implementation

Tries to use glBufferStorage with GL_MAP_PERSISTENT_BIT. Sync fences are automatically managed by glium.

If this function is not available, falls back to glBufferData with GL_DYNAMIC_DRAW.

§

Immutable

Optimized when you will never touch the content of the buffer.

Immutable buffers should be created once and never touched again. Modifying their content is permitted, but is very slow.

Implementation

Tries to use glBufferStorage without any flag. Modifications are done by creating temporary buffers and making the GPU copy the data from the temporary buffer to the real one.

If this function is not available, falls back to glBufferData with GL_STATIC_DRAW.

Trait Implementations§

source§

impl Clone for BufferMode

source§

fn clone(&self) -> BufferMode

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BufferMode

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for BufferMode

source§

fn default() -> BufferMode

Returns the “default value” for a type. Read more
source§

impl PartialEq<BufferMode> for BufferMode

source§

fn eq(&self, other: &BufferMode) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Copy for BufferMode

source§

impl Eq for BufferMode

source§

impl StructuralEq for BufferMode

source§

impl StructuralPartialEq for BufferMode

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> Content for Twhere T: Copy,

§

type Owned = T

A type that holds a sized version of the content.
source§

fn read<F, E>(size: usize, f: F) -> Result<T, E>where F: FnOnce(&mut T) -> Result<(), E>,

Prepares an output buffer, then turns this buffer into an Owned.
source§

fn get_elements_size() -> usize

Returns the size of each element.
source§

fn to_void_ptr(&self) -> *const ()

Produces a pointer to the data.
source§

fn ref_from_ptr<'a>(ptr: *mut (), size: usize) -> Option<*mut T>

Builds a pointer to this type from a raw pointer.
source§

fn is_size_suitable(size: usize) -> bool

Returns true if the size is suitable to store a type like this.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.