#[macro_use]
extern crate filum;
use filum::{Context, BufferViewBuilder, PipelineBuilder, DispatchBuilder};
fn main() {
fibonacci(32);
connected_component_labeling();
}
fn fibonacci(num_elements: usize) {
let mut v: Vec<u32> = (0..num_elements as u32).collect();
let context = Context::new().unwrap();
let buffer_view = BufferViewBuilder::new(&context)
.bind_array::<u32>(num_elements)
.build()
.unwrap();
let pipeline = PipelineBuilder::new(buffer_view.buffer())
.shader("data/fibonacci.comp.spv")
.build()
.unwrap();
let binding = buffer_view.binding();
binding.update_array_copying(&v);
pipeline.dispatch(num_elements);
binding.fetch_array_copying(&mut v);
println!("{:?}", v);
}
fn connected_component_labeling() {
fn dump(v: &[i32], dim_x: usize) {
let lines: Vec<String> = v.iter()
.map(|v| format!("{:3}, ", v))
.collect();
let new_line = "\n".to_string();
let lines: String = lines.chunks(dim_x)
.flat_map(|chunk| chunk.iter().chain(std::iter::once(&new_line)))
.cloned()
.collect();
println!("{}", lines);
}
let dim = (8usize, 8usize);
let table: Vec<i32> = vec![
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 0, 1, 1, 1, 0,
0, 1, 1, 0, 1, 1, 1, 0,
1, 1, 1, 0, 0, 0, 0, 1,
0, 1, 1, 1, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1, 1, 0,
0, 1, 0, 1, 1, 1, 1, 0,
0, 1, 1, 1, 0, 0, 0, 0,
];
let mut table: Vec<i32> = table.into_iter()
.enumerate()
.map(|(i, v)| if v == 0 { -1i32 } else { i as i32 })
.collect();
let len = table.len();
assert_eq!(len, dim.0 * dim.1);
assert!(dim.0.is_power_of_two());
let context = Context::new().unwrap();
let buffer_view = BufferViewBuilder::new(&context)
.bind_array::<i32>(len)
.build()
.unwrap();
let buffer = buffer_view.buffer();
let column = PipelineBuilder::new(buffer)
.shader("data/column.comp.spv")
.specialization(constants!(dim.0 as u32, dim.1 as u32))
.build()
.unwrap();
let merge = PipelineBuilder::new(buffer)
.shader("data/merge.comp.spv")
.specialization(constants!(dim.0 as u32, dim.1 as u32))
.build()
.unwrap();
let relabel = PipelineBuilder::new(buffer)
.shader("data/relabel.comp.spv")
.build()
.unwrap();
let binding = buffer_view.binding();
binding.update_array_copying(&table);
column.dispatch(dim.0);
{
let mut step_index = 0;
let mut n = dim.0 >> 1;
while n != 0 {
println!("n {}, si {}", n, step_index);
let dispatch = DispatchBuilder::new(&merge)
.workgroup_count(n, 1, 1)
.push_constants(constants!(step_index as u32))
.build()
.unwrap();
dispatch.dispatch();
n = n >> 1;
step_index += 1;
}
}
relabel.dispatch(len);
binding.fetch_array_copying(&mut table);
dump(&table, dim.0);
}