vyre_reference/
flat_cpu.rs1use vyre::ir::{BufferAccess, DataType, Program};
9
10use crate::run;
11use crate::value::Value;
12pub fn run_flat(program: &Program, input: &[u8], output: &mut Vec<u8>) -> Result<(), vyre::Error> {
29 let mut offset = 0usize;
30 let mut values = Vec::new();
31 for buffer in program.buffers() {
32 match buffer.access() {
33 BufferAccess::ReadOnly | BufferAccess::Uniform => {
34 let width = buffer.element().min_bytes();
35 let mut bytes = vec![0; width];
36 let available = input.len().saturating_sub(offset).min(width);
37 bytes[..available].copy_from_slice(&input[offset..offset + available]);
38 offset = offset.saturating_add(width).min(input.len());
39 values.push(Value::Bytes(bytes));
40 }
41 BufferAccess::ReadWrite => {
42 values.push(Value::Bytes(vec![0; output_width(buffer.element())]));
43 }
44 BufferAccess::Workgroup => {}
45 _ => {}
46 }
47 }
48 let values = run(program, &values)?;
49 output.clear();
50 for value in values {
51 output.extend_from_slice(&value.to_bytes());
52 }
53 Ok(())
54}
55
56fn output_width(data_type: DataType) -> usize {
57 data_type.min_bytes().max(4)
58}