use crate::lib::*; pub trait TexSize: TrivialBound { const TYPE: GLenum; const SIZE: i32; } macro_rules! impl_size { ($t: ident, $s: literal) => { derive_common_VAL! { pub struct $t; } impl TexSize for $t { const TYPE: GLenum = gl::$t; const SIZE: i32 = $s; } }; } impl_size!(RED, 1); impl_size!(RG, 2); impl_size!(RGB, 3); impl_size!(RGBA, 4); pub trait TexFmt: TrivialBound { const TYPE: GLenum; } macro_rules! impl_fmt { ($t: ty, $g: ident) => { impl TexFmt for $t { const TYPE: GLenum = gl::$g; } }; } impl_fmt!(i8, BYTE); impl_fmt!(u8, UNSIGNED_BYTE); impl_fmt!(i16, SHORT); impl_fmt!(u16, UNSIGNED_SHORT); impl_fmt!(i32, INT); impl_fmt!(u32, UNSIGNED_INT); impl_fmt!(f16, HALF_FLOAT); impl_fmt!(f32, FLOAT); pub fn get_internal_fmt() -> GLenum { match S::TYPE { gl::RED => match F::TYPE { gl::BYTE => gl::R8I, gl::UNSIGNED_BYTE => gl::R8UI, gl::SHORT => gl::R16I, gl::UNSIGNED_SHORT => gl::R16UI, gl::INT => gl::R32I, gl::UNSIGNED_INT => gl::R32UI, gl::HALF_FLOAT => gl::R16F, gl::FLOAT => gl::R32F, _ => unreachable!(), }, gl::RG => match F::TYPE { gl::BYTE => gl::RG8I, gl::UNSIGNED_BYTE => gl::RG8UI, gl::SHORT => gl::RG16I, gl::UNSIGNED_SHORT => gl::RG16UI, gl::INT => gl::RG32I, gl::UNSIGNED_INT => gl::RG32UI, gl::HALF_FLOAT => gl::RG16F, gl::FLOAT => gl::RG32F, _ => unreachable!(), }, gl::RGB => match F::TYPE { gl::BYTE => gl::RGB8I, gl::UNSIGNED_BYTE => gl::RGB8UI, gl::SHORT => gl::RGB16I, gl::UNSIGNED_SHORT => gl::RGB16UI, gl::INT => gl::RGB32I, gl::UNSIGNED_INT => gl::RGB32UI, gl::HALF_FLOAT => gl::RGB16F, gl::FLOAT => gl::RGB32F, _ => unreachable!(), }, gl::RGBA => match F::TYPE { gl::BYTE => gl::RGBA8I, gl::UNSIGNED_BYTE => gl::RGBA8UI, gl::SHORT => gl::RGBA16I, gl::UNSIGNED_SHORT => gl::RGBA16UI, gl::INT => gl::RGBA32I, gl::UNSIGNED_INT => gl::RGBA32UI, gl::HALF_FLOAT => gl::RGBA16F, gl::FLOAT => gl::RGBA32F, _ => unreachable!(), }, _ => unreachable!(), } } pub fn normalize_internal_fmt(fmt: GLenum) -> GLenum { match fmt { gl::R8I | gl::R8UI => gl::R8, gl::R16I | gl::R16UI => gl::R16, gl::RG8I | gl::RG8UI => gl::RG8, gl::RG16I | gl::RG16UI => gl::RG16, gl::RGB8I | gl::RGB8UI => gl::RGB8, gl::RGB16I | gl::RGB16UI => gl::RGB16, gl::RGBA8I | gl::RGBA8UI => gl::RGBA8, gl::RGBA16I | gl::RGBA16UI => gl::RGBA16, f => f, } }