e2rcore/implement/capability/
capability_gl.rs1extern 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}