e2rcore/implement/capability/
capability_gl.rs

1extern crate gl;
2
3use ::std::mem;
4use ::std::ffi::CStr;
5use ::std::os::raw::c_char;
6use ::std::fmt;
7use ::std::vec::Vec;
8
9pub struct CapabilityGL {
10    ver: String,
11    opengl_ver_major: i32,
12    opengl_ver_minor: i32,
13    glsl_ver: String,
14    vendor: String,
15    renderer: String,
16    extensions: Vec< String >,
17}
18
19impl fmt::Display for CapabilityGL {
20    fn fmt( &self, f: & mut fmt::Formatter ) -> fmt::Result {
21        write!( f, "version: {}\n", self.ver )?;
22        write!( f, "opengl version: {}.{}\n", self.opengl_ver_major, self.opengl_ver_minor )?;
23        write!( f, "glsl language version: {}.\n", self.glsl_ver )?;
24        write!( f, "vendor: {}.\n", self.vendor )?;
25        write!( f, "renderer: {}.\n", self.renderer )?;
26        write!( f, "num extensions: {}", self.extensions.len() )?;
27        for i in & self.extensions {
28            write!( f, "extension: {}.\n", i )?;
29        }
30        Ok(())
31    }
32}
33
34pub fn query_gl() -> CapabilityGL {
35    unsafe {
36
37        let renderer_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetString( gl::RENDERER ) );
38        let renderer = CStr::from_ptr( renderer_ptr ).to_str().expect("renderer retrieval failed");
39        
40        let vendor_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetString( gl::VENDOR ) );
41        let vendor = CStr::from_ptr( vendor_ptr ).to_str().expect("vendor retrieval failed");
42        
43        let version_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetString( gl::VERSION ) );
44        let version = CStr::from_ptr( version_ptr ).to_str().expect("version retrieval failed");
45        
46        let glsl_version_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetString( gl::SHADING_LANGUAGE_VERSION ) );
47        let glsl_version = CStr::from_ptr( glsl_version_ptr ).to_str().expect("glsl_version retrieval failed");
48        
49        let mut opengl_version_major : gl::types::GLint = 0;
50        let mut opengl_version_minor : gl::types::GLint = 0;
51        gl::GetIntegerv( gl::MAJOR_VERSION, & mut opengl_version_major );
52        gl::GetIntegerv( gl::MINOR_VERSION, & mut opengl_version_minor );
53
54        let mut nun_extensions : gl::types::GLint = 0;
55        gl::GetIntegerv( gl::NUM_EXTENSIONS, & mut nun_extensions );
56        
57        let mut extensions = vec![];
58        for i in 0..nun_extensions {
59            let ext_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetStringi( gl::EXTENSIONS, i as u32 ) );
60            let ext = CStr::from_ptr( ext_ptr ).to_str().expect("extension retrieval failed");
61            extensions.push( ext.to_string() );
62        }
63        
64        let capability = CapabilityGL {
65            ver: version.to_string(),
66            glsl_ver: glsl_version.to_string(),
67            opengl_ver_major: opengl_version_major,
68            opengl_ver_minor: opengl_version_minor,
69            vendor: vendor.to_string(),
70            renderer: renderer.to_string(),
71            extensions: extensions,
72        };
73
74        capability    
75    }
76}