1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use gleam::gl;

#[cfg(feature = "serde")]
use serde::{Deserialize, Deserializer, Serialize, Serializer};

#[derive(Debug, Clone)]
pub struct GLLimits {
    pub max_vertex_attribs: u32,
    pub max_tex_size: u32,
    pub max_cube_map_tex_size: u32
}

#[cfg(feature = "serde")]
impl Deserialize for GLLimits {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
        where D: Deserializer
    {
        let values = try!(<[_; 3]>::deserialize(deserializer));
        Ok(GLLimits {
            max_vertex_attribs: values[0],
            max_tex_size: values[1],
            max_cube_map_tex_size: values[2],
        })
    }
}

#[cfg(feature = "serde")]
impl Serialize for GLLimits {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
        where S: Serializer
    {
        [self.max_vertex_attribs, self.max_tex_size, self.max_cube_map_tex_size]
            .serialize(serializer)
    }
}

impl GLLimits {
    pub fn detect(gl_: &gl::Gl) -> GLLimits {
        GLLimits {
            max_vertex_attribs: gl_.get_integer_v(gl::MAX_VERTEX_ATTRIBS) as u32,
            max_tex_size: gl_.get_integer_v(gl::MAX_TEXTURE_SIZE) as u32,
            max_cube_map_tex_size: gl_.get_integer_v(gl::MAX_CUBE_MAP_TEXTURE_SIZE) as u32
        }
    }
}