#[macro_use]
extern crate glium;
use glium::Surface;
mod support;
#[test]
fn no_depth_buffer_depth_test() {
let display = support::build_display();
let (vertex_buffer, index_buffer, program) = support::build_fullscreen_red_pipeline(&display);
let texture = glium::texture::Texture2d::new_empty(&display,
glium::texture::UncompressedFloatFormat::U8U8U8U8, 128, 128);
let mut framebuffer = glium::framebuffer::SimpleFrameBuffer::new(&display, &texture);
let parameters = glium::DrawParameters {
depth_test: glium::DepthTest::IfLess,
.. Default::default()
};
match framebuffer.draw(&vertex_buffer, &index_buffer, &program,
&glium::uniforms::EmptyUniforms, ¶meters)
{
Err(glium::DrawError::NoDepthBuffer) => (),
a => panic!("{:?}", a)
};
display.assert_no_error(None);
}
#[test]
fn no_depth_buffer_depth_write() {
let display = support::build_display();
let (vertex_buffer, index_buffer, program) = support::build_fullscreen_red_pipeline(&display);
let texture = glium::texture::Texture2d::new_empty(&display,
glium::texture::UncompressedFloatFormat::U8U8U8U8, 128, 128);
let mut framebuffer = glium::framebuffer::SimpleFrameBuffer::new(&display, &texture);
let parameters = glium::DrawParameters {
depth_write: true,
.. Default::default()
};
match framebuffer.draw(&vertex_buffer, &index_buffer, &program,
&glium::uniforms::EmptyUniforms, ¶meters)
{
Err(glium::DrawError::NoDepthBuffer) => (),
a => panic!("{:?}", a)
};
display.assert_no_error(None);
}
#[test]
fn simple_dimensions() {
let display = support::build_display();
let texture = glium::Texture2d::new_empty(&display,
glium::texture::UncompressedFloatFormat::U8U8U8U8,
128, 128);
let framebuffer = glium::framebuffer::SimpleFrameBuffer::new(&display, &texture);
assert_eq!(framebuffer.get_dimensions(), (128, 128));
display.assert_no_error(None);
}
#[test]
fn simple_render_to_texture() {
let display = support::build_display();
let (vb, ib, program) = support::build_fullscreen_red_pipeline(&display);
let texture = glium::Texture2d::new_empty(&display,
glium::texture::UncompressedFloatFormat::U8U8U8U8,
128, 128);
let mut framebuffer = glium::framebuffer::SimpleFrameBuffer::new(&display, &texture);
framebuffer.draw(&vb, &ib, &program, &glium::uniforms::EmptyUniforms, &Default::default()).unwrap();
let read_back: Vec<Vec<(u8, u8, u8, u8)>> = texture.read();
assert_eq!(read_back[0][0], (255, 0, 0, 255));
assert_eq!(read_back[64][64], (255, 0, 0, 255));
assert_eq!(read_back[127][127], (255, 0, 0, 255));
display.assert_no_error(None);
}
#[test]
fn depth_texture2d() {
use std::iter;
let display = support::build_display();
let (vb, ib) = support::build_rectangle_vb_ib(&display);
let program = program!(&display,
110 => {
vertex: "
#version 110
attribute vec2 position;
void main() {
gl_Position = vec4(position, position.x, 1.0);
}
",
fragment: "
#version 110
void main() {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
",
},
100 => {
vertex: "
#version 100
attribute lowp vec2 position;
void main() {
gl_Position = vec4(position, position.x, 1.0);
}
",
fragment: "
#version 100
void main() {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
",
}).unwrap();
let color = glium::Texture2d::new_empty(&display,
glium::texture::UncompressedFloatFormat::U8U8U8U8,
128, 128);
let depth_data = iter::repeat(iter::repeat(0.5f32).take(128).collect::<Vec<_>>())
.take(128).collect::<Vec<_>>();
let depth = match glium::texture::DepthTexture2d::new_if_supported(&display, depth_data) {
None => return,
Some(t) => t
};
let mut framebuffer = glium::framebuffer::SimpleFrameBuffer::with_depth_buffer(&display,
&color, &depth);
let params = glium::DrawParameters {
depth_test: glium::DepthTest::IfLess,
.. Default::default()
};
framebuffer.clear_color(0.0, 0.0, 0.0, 1.0);
framebuffer.draw(&vb, &ib, &program, &glium::uniforms::EmptyUniforms, ¶ms).unwrap();
let read_back: Vec<Vec<(u8, u8, u8, u8)>> = color.read();
assert_eq!(read_back[0][0], (255, 255, 255, 255));
assert_eq!(read_back[127][127], (0, 0, 0, 255));
display.assert_no_error(None);
}
#[test]
fn multioutput() {
let display = support::build_display();
let (vb, ib) = support::build_rectangle_vb_ib(&display);
let program = match glium::Program::from_source(&display,
"
#version 110
attribute vec2 position;
void main() {
gl_Position = vec4(position, 0.0, 1.0);
}
",
"
#version 330
out vec4 color1;
out vec4 color2;
void main() {
color1 = vec4(1.0, 1.0, 1.0, 1.0);
color2 = vec4(1.0, 0.0, 0.0, 1.0);
}
",
None)
{
Err(glium::CompilationError(_)) => return,
Ok(p) => p,
e => e.unwrap()
};
let color1 = glium::Texture2d::new_empty(&display,
glium::texture::UncompressedFloatFormat::U8U8U8U8,
128, 128);
color1.as_surface().clear_color(0.0, 0.0, 0.0, 1.0);
let color2 = glium::Texture2d::new_empty(&display,
glium::texture::UncompressedFloatFormat::U8U8U8U8,
128, 128);
color2.as_surface().clear_color(0.0, 0.0, 0.0, 1.0);
let mut framebuffer = glium::framebuffer::MultiOutputFrameBuffer::new(&display,
&[("color1", &color1), ("color2", &color2)]);
framebuffer.draw(&vb, &ib, &program, &glium::uniforms::EmptyUniforms,
&Default::default()).unwrap();
let read_back1: Vec<Vec<(u8, u8, u8, u8)>> = color1.read();
for row in read_back1.iter() {
for pixel in row.iter() {
assert_eq!(pixel, &(255, 255, 255, 255));
}
}
let read_back2: Vec<Vec<(u8, u8, u8, u8)>> = color2.read();
for row in read_back2.iter() {
for pixel in row.iter() {
assert_eq!(pixel, &(255, 0, 0, 255));
}
}
display.assert_no_error(None);
}