// CL_INVALID_VALUE if the region being read or written specified by (buffer_origin, region,
// buffer_row_pitch, buffer_slice_pitch) is out of bounds.
- if !CLVec::is_in_bound(
- r,
- buf_ori,
- [1, buffer_row_pitch, buffer_slice_pitch],
- buf.size,
- ) {
+ if CLVec::calc_size(r + buf_ori, [1, buffer_row_pitch, buffer_slice_pitch]) > buf.size {
return Err(CL_INVALID_VALUE);
}
// CL_INVALID_VALUE if the region being read or written specified by (buffer_origin, region,
// buffer_row_pitch, buffer_slice_pitch) is out of bounds.
- if !CLVec::is_in_bound(
- r,
- buf_ori,
- [1, buffer_row_pitch, buffer_slice_pitch],
- buf.size,
- ) {
+ if CLVec::calc_size(r + buf_ori, [1, buffer_row_pitch, buffer_slice_pitch]) > buf.size {
return Err(CL_INVALID_VALUE);
}
// CL_INVALID_VALUE if (src_origin, region, src_row_pitch, src_slice_pitch) or (dst_origin,
// region, dst_row_pitch, dst_slice_pitch) require accessing elements outside the src_buffer
// and dst_buffer buffer objects respectively.
- if !CLVec::is_in_bound(r, src_ori, [1, src_row_pitch, src_slice_pitch], src.size)
- || !CLVec::is_in_bound(r, dst_ori, [1, dst_row_pitch, dst_slice_pitch], dst.size)
+ if CLVec::calc_size(r + src_ori, [1, src_row_pitch, src_slice_pitch]) > src.size
+ || CLVec::calc_size(r + dst_ori, [1, dst_row_pitch, dst_slice_pitch]) > dst.size
{
return Err(CL_INVALID_VALUE);
}
use rusticl_opencl_gen::*;
+use std::borrow::Borrow;
use std::iter::Product;
#[macro_export]
}
impl CLVec<usize> {
- pub fn is_in_bound(base: Self, offset: Self, pitch: [usize; 3], size: usize) -> bool {
- (base + offset - [1, 1, 1]) * pitch < size
+ /// returns the offset of point in linear memory.
+ pub fn calc_offset<T: Borrow<Self>>(point: T, pitch: [usize; 3]) -> usize {
+ *point.borrow() * pitch
+ }
+
+ /// returns the scalar size of the described region in linear memory.
+ pub fn calc_size<T: Borrow<Self>>(region: T, pitch: [usize; 3]) -> usize {
+ (*region.borrow() - [0, 1, 1]) * pitch
+ }
+
+ pub fn calc_offset_size<T1: Borrow<Self>, T2: Borrow<Self>>(
+ base: T1,
+ region: T2,
+ pitch: [usize; 3],
+ ) -> (usize, usize) {
+ (
+ Self::calc_offset(base, pitch),
+ Self::calc_size(region, pitch),
+ )
}
}