mallumo-gls 0.43.0

Small low level library for modern (4.5 Core) OpenGL
Documentation
use super::*;
use super::errors::*;

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum ImageAccess {
    Read,
    Write,
    ReadWrite,
}

impl From<ImageAccess> for u32 {
    fn from(access: ImageAccess) -> Self {
        match access {
            ImageAccess::Read => gl::READ_ONLY,
            ImageAccess::Write => gl::WRITE_ONLY,
            ImageAccess::ReadWrite => gl::READ_WRITE,
        }
    }
}

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum ImageInternalFormat {
    R8,
    R8SN,
    R8I,
    R8UI,
    R16,
    R16F,
    R16SN,
    R16I,
    R16UI,
    R32F,
    R32I,
    R32UI,

    RG8,
    RG8SN,
    RG8I,
    RG8UI,
    RG16,
    RG16F,
    RG16SN,
    RG16I,
    RG16UI,
    RG32F,
    RG32I,
    RG32UI,

    RGBA8,
    RGBA8SN,
    RGBA8I,
    RGBA8UI,
    RGBA16,
    RGBA16F,
    RGBA16SN,
    RGBA16I,
    RGBA16UI,
    RGBA32F,
    RGBA32I,
    RGBA32UI,

    RGB10A2,
    RGB10A2UI,
    R11FG11FB10F,
}

impl From<ImageInternalFormat> for gl::types::GLenum {
    fn from(internal_format: ImageInternalFormat) -> gl::types::GLenum {
        match internal_format {
            ImageInternalFormat::R8 => gl::R8,
            ImageInternalFormat::R8SN => gl::R8_SNORM,
            ImageInternalFormat::R8I => gl::R8I,
            ImageInternalFormat::R8UI => gl::R8UI,
            ImageInternalFormat::R16 => gl::R16,
            ImageInternalFormat::R16F => gl::R16F,
            ImageInternalFormat::R16SN => gl::R16_SNORM,
            ImageInternalFormat::R16I => gl::R16I,
            ImageInternalFormat::R16UI => gl::R16UI,
            ImageInternalFormat::R32F => gl::R32F,
            ImageInternalFormat::R32I => gl::R32I,
            ImageInternalFormat::R32UI => gl::R32UI,

            ImageInternalFormat::RG8 => gl::RG8,
            ImageInternalFormat::RG8SN => gl::RG8_SNORM,
            ImageInternalFormat::RG8I => gl::RG8I,
            ImageInternalFormat::RG8UI => gl::RG8UI,
            ImageInternalFormat::RG16 => gl::RG16,
            ImageInternalFormat::RG16F => gl::RG16F,
            ImageInternalFormat::RG16SN => gl::RG16_SNORM,
            ImageInternalFormat::RG16I => gl::RG16I,
            ImageInternalFormat::RG16UI => gl::RG16UI,
            ImageInternalFormat::RG32F => gl::RG32F,
            ImageInternalFormat::RG32I => gl::RG32I,
            ImageInternalFormat::RG32UI => gl::RG32UI,

            ImageInternalFormat::RGBA8 => gl::RGBA8,
            ImageInternalFormat::RGBA8SN => gl::RGBA8_SNORM,
            ImageInternalFormat::RGBA8I => gl::RGBA8I,
            ImageInternalFormat::RGBA8UI => gl::RGBA8UI,
            ImageInternalFormat::RGBA16 => gl::RGBA16,
            ImageInternalFormat::RGBA16F => gl::RGBA16F,
            ImageInternalFormat::RGBA16SN => gl::RGBA16_SNORM,
            ImageInternalFormat::RGBA16I => gl::RGBA16I,
            ImageInternalFormat::RGBA16UI => gl::RGBA16UI,
            ImageInternalFormat::RGBA32F => gl::RGBA32F,
            ImageInternalFormat::RGBA32I => gl::RGBA32I,
            ImageInternalFormat::RGBA32UI => gl::RGBA32UI,

            ImageInternalFormat::RGB10A2 => gl::RGB10_A2,
            ImageInternalFormat::RGB10A2UI => gl::RGB10_A2UI,
            ImageInternalFormat::R11FG11FB10F => gl::R11F_G11F_B10F,
        }
    }
}

pub unsafe fn bind_image_texture(
    unit: usize,
    id: TextureId,
    level: usize,
    layer: Option<usize>,
    access: ImageAccess,
    format: ImageInternalFormat,
) -> Result<()> {
    match layer {
        Some(layer) => gl::BindImageTexture(
            unit as u32,
            id.into(),
            level as i32,
            gl::FALSE,
            layer as i32,
            access.into(),
            format.into(),
        ),
        None => gl::BindImageTexture(
            unit as u32,
            id.into(),
            level as i32,
            gl::TRUE,
            0,
            access.into(),
            format.into(),
        ),
    }

    get_error(())
}