oarust 0.8.6

GPU-first semantic computing engine written in Rust
use super::{KernelId, SPIRV_MAGIC, reflect_workgroup_memory_size};

fn instruction(words: &mut Vec<u32>, opcode: u32, operands: &[u32]) {
	words.push(((operands.len() as u32 + 1) << 16) | opcode);
	words.extend_from_slice(operands);
}

#[test]
fn sizes_nested_arrays_vectors_and_multiple_variables() {
	let mut words = vec![SPIRV_MAGIC, 0x10500, 0, 20, 0];
	instruction(&mut words, 21, &[1, 32, 0]);
	instruction(&mut words, 43, &[1, 2, 256]);
	instruction(&mut words, 43, &[1, 3, 2]);
	instruction(&mut words, 23, &[4, 1, 4]);
	instruction(&mut words, 28, &[5, 4, 2]);
	instruction(&mut words, 28, &[6, 5, 3]);
	instruction(&mut words, 32, &[7, 4, 6]);
	instruction(&mut words, 59, &[7, 8, 4]);
	instruction(&mut words, 32, &[9, 4, 1]);
	instruction(&mut words, 59, &[9, 10, 4]);
	assert_eq!(reflect_workgroup_memory_size(&words).unwrap(), 8196);
	instruction(&mut words, 59, &[7, 11, 4]);
	assert_eq!(reflect_workgroup_memory_size(&words).unwrap(), 16388);
}

#[test]
fn rejects_overflow_and_truncated_artifacts() {
	let mut words = vec![SPIRV_MAGIC, 0x10500, 0, 10, 0];
	instruction(&mut words, 21, &[1, 32, 0]);
	instruction(&mut words, 43, &[1, 2, u32::MAX]);
	instruction(&mut words, 28, &[3, 1, 2]);
	instruction(&mut words, 32, &[4, 4, 3]);
	instruction(&mut words, 59, &[4, 5, 4]);
	assert!(reflect_workgroup_memory_size(&words).is_err());
	words.pop();
	assert!(reflect_workgroup_memory_size(&words).is_err());
}

#[test]
fn sizes_every_registered_profile_artifact() -> crate::Result<()> {
	for kernel in KernelId::ALL {
		kernel.artifact().workgroup_memory_size()?;
		kernel.bounded_artifact().workgroup_memory_size()?;
	}
	Ok(())
}