use tests;
const ADDEND: ClInt4 = ClInt4(1, 1, 1, 1);
const DIMS: [usize; 3] = [64, 128, 4];
const TEST_ITERS: i32 = 4;
#[test]
fn image_ops() {
let src = r#"
__kernel void add(
sampler_t sampler_host,
__private int4 addend,
read_only image3d_t img_src,
write_only image3d_t img_dst)
{
int4 coord = (int4)(get_global_id(0), get_global_id(1), get_global_id(2), 0);
int4 pixel = read_imagei(img_src, sampler_host, coord);
pixel += addend;
write_imagei(img_dst, coord, pixel);
}
__kernel void fill(
sampler_t sampler_host,
__private int4 pixel,
write_only image3d_t img)
{
int4 coord = (int4)(get_global_id(0), get_global_id(1), get_global_id(2), 0);
write_imagei(img, coord, pixel);
}
"#;
let proque = ProQue::builder()
.src(src)
.dims(DIMS)
.build().unwrap();
let sampler = Sampler::new(proque.context(), false, AddressingMode::None, FilterMode::Nearest).unwrap();
let mut vec = vec![0i32; proque.dims().to_len() * 4];
let img_src = Image::<i32>::builder()
.channel_order(ImageChannelOrder::Rgba)
.channel_data_type(ImageChannelDataType::SignedInt32)
.image_type(MemObjectType::Image3d)
.dims(proque.dims())
.flags(::MEM_READ_WRITE | ::MEM_COPY_HOST_PTR)
.build_with_data(proque.queue(), &vec).unwrap();
let img_dst = Image::<i32>::builder()
.channel_order(ImageChannelOrder::Rgba)
.channel_data_type(ImageChannelDataType::SignedInt32)
.image_type(MemObjectType::Image3d)
.dims(proque.dims())
.flags(::MEM_WRITE_ONLY | ::MEM_COPY_HOST_PTR)
.build_with_data(proque.queue(), &vec).unwrap();
let kernel_add = proque.create_kernel("add").unwrap()
.arg_smp(&sampler)
.arg_vec(ADDEND)
.arg_img(&img_src)
.arg_img(&img_dst);
let mut kernel_fill_src = proque.create_kernel("fill").unwrap()
.arg_smp(&sampler)
.arg_vec_named::<ClInt4>("pixel", None)
.arg_img(&img_src);
let dims = proque.dims().to_lens().unwrap();
assert_eq!(DIMS, dims);
assert_eq!(DIMS, kernel_add.get_gws().to_lens().unwrap());
let len = proque.dims().to_len();
assert_eq!(img_src.dims().to_len(), len);
assert_eq!(img_dst.dims().to_len(), len);
let pixel_element_len = img_src.pixel_element_len();
assert_eq!(vec.len(), len * pixel_element_len);
kernel_add.enq().unwrap();
let mut ttl_runs = 1i32;
img_dst.read(&mut vec).enq().unwrap();
for idx in 0..vec.len() {
assert!(vec[idx] == ADDEND.0 * ttl_runs, "vec[{}]: {}", idx, vec[idx]);
}
print!("\n");
tests::verify_vec_rect([0, 0, 0], dims, ADDEND.0 * ttl_runs,
ADDEND.0 * (ttl_runs - 1), dims, pixel_element_len, &vec, ttl_runs, true).unwrap();
for _ in 0..TEST_ITERS {
let (region, origin) = (dims, [0, 0, 0]);
::enqueue_write_image(proque.queue(), &img_src, true,
origin, region, 0, 0,
&vec, None, None).unwrap();
kernel_add.enq().expect("[FIXME]: HANDLE ME!");
ttl_runs += 1;
let (cur_val, old_val) = (ADDEND.0 * ttl_runs, ADDEND.0 * (ttl_runs - 1));
unsafe { ::enqueue_read_image(proque.queue(), &img_dst, true,
origin, region, 0, 0,
&mut vec, None, None).unwrap(); }
proque.queue().finish();
tests::verify_vec_rect(origin, region, cur_val, old_val,
dims, pixel_element_len, &vec, ttl_runs, true).unwrap();
ttl_runs += 1;
let (cur_val, old_val) = (ADDEND.0 * ttl_runs, ADDEND.0 * (ttl_runs - 1));
let cur_pixel = ClInt4(cur_val, cur_val, cur_val, cur_val);
kernel_fill_src.set_arg_vec_named("pixel", cur_pixel).unwrap().enq().expect("[FIXME]: HANDLE ME!");
::enqueue_copy_image::<i32>(proque.queue(), &img_src, &img_dst,
origin, origin, region, None, None).unwrap();
unsafe { ::enqueue_read_image(proque.queue(), &img_dst, true,
origin, region, 0, 0,
&mut vec, None, None).unwrap(); }
proque.queue().finish();
tests::verify_vec_rect(origin, region, cur_val, old_val,
dims, pixel_element_len, &vec, ttl_runs, true).unwrap();
img_src.cmd().write(&vec).enq().unwrap();
kernel_add.enq().expect("[FIXME]: HANDLE ME!");
ttl_runs += 1;
let (cur_val, old_val) = (ADDEND.0 * ttl_runs, ADDEND.0 * (ttl_runs - 1));
img_dst.cmd().read(&mut vec).enq().unwrap();
tests::verify_vec_rect(origin, region, cur_val, old_val,
dims, pixel_element_len, &vec, ttl_runs, true).unwrap();
ttl_runs += 1;
let (cur_val, old_val) = (ADDEND.0 * ttl_runs, ADDEND.0 * (ttl_runs - 1));
let cur_pixel = ClInt4(cur_val, cur_val, cur_val, cur_val);
kernel_fill_src.set_arg_vec_named("pixel", cur_pixel).unwrap().enq().expect("[FIXME]: HANDLE ME!");
img_src.cmd().copy(&img_dst, origin).enq().unwrap();
img_dst.cmd().read(&mut vec).enq().unwrap();
tests::verify_vec_rect(origin, region, cur_val, old_val,
dims, pixel_element_len, &vec, ttl_runs, true).unwrap();
}
println!("{} total test runs complete.\n", ttl_runs);
}