grafix_toolbox/kit/opengl/texture/
format.rs1use crate::lib::*;
2
3pub trait TexSize: TrivialBound {
4 const TYPE: GLenum;
5 const SIZE: i32;
6}
7macro_rules! impl_size {
8 ($t: ident, $s: literal) => {
9 derive_common_VAL! { pub struct $t; }
10 impl TexSize for $t {
11 const TYPE: GLenum = gl::$t;
12 const SIZE: i32 = $s;
13 }
14 };
15}
16impl_size!(RED, 1);
17impl_size!(RG, 2);
18impl_size!(RGB, 3);
19impl_size!(RGBA, 4);
20
21pub trait TexFmt: TrivialBound {
22 const TYPE: GLenum;
23}
24macro_rules! impl_fmt {
25 ($t: ty, $g: ident) => {
26 impl TexFmt for $t {
27 const TYPE: GLenum = gl::$g;
28 }
29 };
30}
31impl_fmt!(i8, BYTE);
32impl_fmt!(u8, UNSIGNED_BYTE);
33impl_fmt!(i16, SHORT);
34impl_fmt!(u16, UNSIGNED_SHORT);
35impl_fmt!(i32, INT);
36impl_fmt!(u32, UNSIGNED_INT);
37impl_fmt!(f16, HALF_FLOAT);
38impl_fmt!(f32, FLOAT);
39
40pub fn get_internal_fmt<S: TexSize, F: TexFmt>() -> GLenum {
41 match S::TYPE {
42 gl::RED => match F::TYPE {
43 gl::BYTE => gl::R8I,
44 gl::UNSIGNED_BYTE => gl::R8UI,
45 gl::SHORT => gl::R16I,
46 gl::UNSIGNED_SHORT => gl::R16UI,
47 gl::INT => gl::R32I,
48 gl::UNSIGNED_INT => gl::R32UI,
49 gl::HALF_FLOAT => gl::R16F,
50 gl::FLOAT => gl::R32F,
51 _ => unreachable!(),
52 },
53 gl::RG => match F::TYPE {
54 gl::BYTE => gl::RG8I,
55 gl::UNSIGNED_BYTE => gl::RG8UI,
56 gl::SHORT => gl::RG16I,
57 gl::UNSIGNED_SHORT => gl::RG16UI,
58 gl::INT => gl::RG32I,
59 gl::UNSIGNED_INT => gl::RG32UI,
60 gl::HALF_FLOAT => gl::RG16F,
61 gl::FLOAT => gl::RG32F,
62 _ => unreachable!(),
63 },
64 gl::RGB => match F::TYPE {
65 gl::BYTE => gl::RGB8I,
66 gl::UNSIGNED_BYTE => gl::RGB8UI,
67 gl::SHORT => gl::RGB16I,
68 gl::UNSIGNED_SHORT => gl::RGB16UI,
69 gl::INT => gl::RGB32I,
70 gl::UNSIGNED_INT => gl::RGB32UI,
71 gl::HALF_FLOAT => gl::RGB16F,
72 gl::FLOAT => gl::RGB32F,
73 _ => unreachable!(),
74 },
75 gl::RGBA => match F::TYPE {
76 gl::BYTE => gl::RGBA8I,
77 gl::UNSIGNED_BYTE => gl::RGBA8UI,
78 gl::SHORT => gl::RGBA16I,
79 gl::UNSIGNED_SHORT => gl::RGBA16UI,
80 gl::INT => gl::RGBA32I,
81 gl::UNSIGNED_INT => gl::RGBA32UI,
82 gl::HALF_FLOAT => gl::RGBA16F,
83 gl::FLOAT => gl::RGBA32F,
84 _ => unreachable!(),
85 },
86 _ => unreachable!(),
87 }
88}
89
90pub fn normalize_internal_fmt(fmt: GLenum) -> GLenum {
91 match fmt {
92 gl::R8I | gl::R8UI => gl::R8,
93 gl::R16I | gl::R16UI => gl::R16,
94
95 gl::RG8I | gl::RG8UI => gl::RG8,
96 gl::RG16I | gl::RG16UI => gl::RG16,
97
98 gl::RGB8I | gl::RGB8UI => gl::RGB8,
99 gl::RGB16I | gl::RGB16UI => gl::RGB16,
100
101 gl::RGBA8I | gl::RGBA8UI => gl::RGBA8,
102 gl::RGBA16I | gl::RGBA16UI => gl::RGBA16,
103
104 f => f,
105 }
106}