Use modern GL code for the examples

This commit is contained in:
Pierre Krieger 2015-08-05 22:31:34 +02:00
parent 4ab83a23e5
commit 9261408cc8
8 changed files with 73 additions and 58 deletions

View file

@ -135,15 +135,8 @@ fn main() {
let mut file = File::create(&dest.join("test_gl_bindings.rs")).unwrap(); let mut file = File::create(&dest.join("test_gl_bindings.rs")).unwrap();
gl_generator::generate_bindings(gl_generator::StructGenerator, gl_generator::generate_bindings(gl_generator::StructGenerator,
gl_generator::registry::Ns::Gl, gl_generator::registry::Ns::Gles2,
gl_generator::Fallbacks::All, gl_generator::Fallbacks::All,
khronos_api::GL_XML, vec![], khronos_api::GL_XML, vec![],
"1.1", "core", &mut file).unwrap(); "2.0", "core", &mut file).unwrap();
let mut file = File::create(&dest.join("test_gles1_bindings.rs")).unwrap();
gl_generator::generate_bindings(gl_generator::StructGenerator,
gl_generator::registry::Ns::Gles1,
gl_generator::Fallbacks::All,
khronos_api::GL_XML, vec![],
"1.1", "core", &mut file).unwrap();
} }

View file

@ -17,7 +17,7 @@ fn main() { println!("This example requires glutin to be compiled with the `wind
#[cfg(feature = "window")] #[cfg(feature = "window")]
fn main() { fn main() {
let window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); let window = glutin::WindowBuilder::new().build().unwrap();
window.set_title("A fantastic window!"); window.set_title("A fantastic window!");
unsafe { window.make_current() }; unsafe { window.make_current() };

View file

@ -35,7 +35,6 @@ fn main() {
}; };
let window = glutin::WindowBuilder::new() let window = glutin::WindowBuilder::new()
.with_gl_profile(glutin::GlProfile::Compatibility)
.with_title("Hello world!".to_string()) .with_title("Hello world!".to_string())
.with_fullscreen(monitor) .with_fullscreen(monitor)
.build() .build()

View file

@ -16,7 +16,7 @@ fn main() { println!("This example requires glutin to be compiled with the `wind
#[cfg(feature = "window")] #[cfg(feature = "window")]
fn main() { fn main() {
let window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); let window = glutin::WindowBuilder::new().build().unwrap();
window.set_title("glutin - Cursor grabbing test"); window.set_title("glutin - Cursor grabbing test");
unsafe { window.make_current() }; unsafe { window.make_current() };

View file

@ -16,9 +16,9 @@ fn main() { println!("This example requires glutin to be compiled with the `wind
#[cfg(feature = "window")] #[cfg(feature = "window")]
fn main() { fn main() {
let window1 = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); let window1 = glutin::WindowBuilder::new().build().unwrap();
let window2 = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); let window2 = glutin::WindowBuilder::new().build().unwrap();
let window3 = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); let window3 = glutin::WindowBuilder::new().build().unwrap();
let t1 = thread::spawn(move || { let t1 = thread::spawn(move || {
run(window1, (0.0, 1.0, 0.0, 1.0)); run(window1, (0.0, 1.0, 0.0, 1.0));

View file

@ -1,19 +1,15 @@
#![cfg(feature = "window")] #![cfg(feature = "window")]
use std::ffi::CStr; use std::ffi::CStr;
use std::mem;
use std::ptr;
use glutin; use glutin;
#[cfg(not(target_os = "android"))]
mod gl { mod gl {
pub use self::Gles2 as Gl;
include!(concat!(env!("OUT_DIR"), "/test_gl_bindings.rs")); include!(concat!(env!("OUT_DIR"), "/test_gl_bindings.rs"));
} }
#[cfg(target_os = "android")]
mod gl {
pub use self::Gles1 as Gl;
include!(concat!(env!("OUT_DIR"), "/test_gles1_bindings.rs"));
}
pub struct Context { pub struct Context {
gl: gl::Gl gl: gl::Gl
} }
@ -28,30 +24,47 @@ pub fn load(window: &glutin::Window) -> Context {
println!("OpenGL version {}", version); println!("OpenGL version {}", version);
unsafe {
let vs = gl.CreateShader(gl::VERTEX_SHADER);
gl.ShaderSource(vs, 1, [VS_SRC.as_ptr() as *const i8].as_ptr(), ptr::null());
gl.CompileShader(vs);
let fs = gl.CreateShader(gl::FRAGMENT_SHADER);
gl.ShaderSource(fs, 1, [FS_SRC.as_ptr() as *const i8].as_ptr(), ptr::null());
gl.CompileShader(fs);
let program = gl.CreateProgram();
gl.AttachShader(program, vs);
gl.AttachShader(program, fs);
gl.LinkProgram(program);
gl.UseProgram(program);
let mut vb = mem::uninitialized();
gl.GenBuffers(1, &mut vb);
gl.BindBuffer(gl::ARRAY_BUFFER, vb);
gl.BufferData(gl::ARRAY_BUFFER,
(VERTEX_DATA.len() * mem::size_of::<f32>()) as gl::types::GLsizeiptr,
VERTEX_DATA.as_ptr() as *const _, gl::STATIC_DRAW);
/*let mut vao = mem::uninitialized();
gl.GenVertexArrays(1, &mut vao);
gl.BindVertexArray(vao);*/
let pos_attrib = gl.GetAttribLocation(program, b"position\0".as_ptr() as *const _);
let color_attrib = gl.GetAttribLocation(program, b"color\0".as_ptr() as *const _);
gl.VertexAttribPointer(pos_attrib as gl::types::GLuint, 2, gl::FLOAT, 0,
5 * mem::size_of::<f32>() as gl::types::GLsizei,
ptr::null());
gl.VertexAttribPointer(color_attrib as gl::types::GLuint, 3, gl::FLOAT, 0,
5 * mem::size_of::<f32>() as gl::types::GLsizei,
(2 * mem::size_of::<f32>()) as *const () as *const _);
gl.EnableVertexAttribArray(pos_attrib as gl::types::GLuint);
gl.EnableVertexAttribArray(color_attrib as gl::types::GLuint);
}
Context { gl: gl } Context { gl: gl }
} }
impl Context { impl Context {
#[cfg(not(target_os = "android"))]
pub fn draw_frame(&self, color: (f32, f32, f32, f32)) {
unsafe {
self.gl.ClearColor(color.0, color.1, color.2, color.3);
self.gl.Clear(gl::COLOR_BUFFER_BIT);
self.gl.Begin(gl::TRIANGLES);
self.gl.Color3f(1.0, 0.0, 0.0);
self.gl.Vertex2f(-0.5, -0.5);
self.gl.Color3f(0.0, 1.0, 0.0);
self.gl.Vertex2f(0.0, 0.5);
self.gl.Color3f(0.0, 0.0, 1.0);
self.gl.Vertex2f(0.5, -0.5);
self.gl.End();
self.gl.Flush();
}
}
#[cfg(target_os = "android")]
pub fn draw_frame(&self, color: (f32, f32, f32, f32)) { pub fn draw_frame(&self, color: (f32, f32, f32, f32)) {
use std::mem; use std::mem;
@ -59,26 +72,37 @@ impl Context {
self.gl.ClearColor(color.0, color.1, color.2, color.3); self.gl.ClearColor(color.0, color.1, color.2, color.3);
self.gl.Clear(gl::COLOR_BUFFER_BIT); self.gl.Clear(gl::COLOR_BUFFER_BIT);
self.gl.EnableClientState(gl::VERTEX_ARRAY);
self.gl.EnableClientState(gl::COLOR_ARRAY);
self.gl.VertexPointer(2, gl::FLOAT, (mem::size_of::<f32>() * 5) as i32,
mem::transmute(VERTEX_DATA.as_ptr()));
self.gl.ColorPointer(3, gl::FLOAT, (mem::size_of::<f32>() * 5) as i32,
mem::transmute(VERTEX_DATA.as_ptr().offset(2)));
self.gl.DrawArrays(gl::TRIANGLES, 0, 3); self.gl.DrawArrays(gl::TRIANGLES, 0, 3);
self.gl.DisableClientState(gl::VERTEX_ARRAY);
self.gl.DisableClientState(gl::COLOR_ARRAY);
self.gl.Flush();
} }
} }
} }
#[cfg(target_os = "android")]
static VERTEX_DATA: [f32; 15] = [ static VERTEX_DATA: [f32; 15] = [
-0.5, -0.5, 1.0, 0.0, 0.0, -0.5, -0.5, 1.0, 0.0, 0.0,
0.0, 0.5, 0.0, 1.0, 0.0, 0.0, 0.5, 0.0, 1.0, 0.0,
0.5, -0.5, 0.0, 0.0, 1.0 0.5, -0.5, 0.0, 0.0, 1.0
]; ];
const VS_SRC: &'static [u8] = b"
#version 100
lowp attribute vec2 position;
lowp attribute vec3 color;
lowp varying vec3 v_color;
void main() {
gl_Position = vec4(position, 0.0, 1.0);
v_color = color;
}
\0";
const FS_SRC: &'static [u8] = b"
#version 100
lowp varying vec3 v_color;
void main() {
gl_FragColor = vec4(v_color, 1.0);
}
\0";

View file

@ -19,8 +19,7 @@ fn resize_callback(width: u32, height: u32) {
#[cfg(feature = "window")] #[cfg(feature = "window")]
fn main() { fn main() {
let mut window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility) let mut window = glutin::WindowBuilder::new().with_decorations(false)
.with_decorations(false)
.with_transparency(true) .with_transparency(true)
.build().unwrap(); .build().unwrap();
window.set_title("A fantastic window!"); window.set_title("A fantastic window!");

View file

@ -19,7 +19,7 @@ fn resize_callback(width: u32, height: u32) {
#[cfg(feature = "window")] #[cfg(feature = "window")]
fn main() { fn main() {
let mut window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); let mut window = glutin::WindowBuilder::new().build().unwrap();
window.set_title("A fantastic window!"); window.set_title("A fantastic window!");
window.set_window_resize_callback(Some(resize_callback as fn(u32, u32))); window.set_window_resize_callback(Some(resize_callback as fn(u32, u32)));
unsafe { window.make_current() }; unsafe { window.make_current() };