可以使用如下函数来映射图像对象到主机内存区域:
void *clEnqueueMapImage (cl_command_queue command_queue,
cl_mem image,
cl_bool blocking_map,
cl_map_flags map_flags,
const size_t *origin,
const size_t *region,
size_t *image_row_pitch,
size_t *image_slice_pitch,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event,
cl_int *errcode_ret)
- 参数image为一个有效的图像对象。command_queue和image必须在同一个上下文中。
-
参数blocking_map表明此映射是阻塞的还是非阻塞的。
-
参数map_f lags为位域。
-
参数origin定义了所要映射区域的起始位置(x,y,z),单位为像素。对于3维图像阵列,定义了图像索引(z)以及图像起始位置(x,y),对于2维图像阵列,(x,y,z)定义的是起始位置(x,y);对于1维图像阵列定义的是起始位置(x)。如果image是2维图像对象,origin[2]必须是0。如果image是1维图像对象或1维图像缓冲区对象, origin[1]和origin[2]都必须是0,如果image是1维图像阵列对象,origin[2]必须是0,origin[1]是图像在阵列中的索引。如果image是2维图像阵列对象,则origin[2]是图像在阵列中的索引。
[插图]参数region定义了要映射区域的大小(width,height,depth),单位为像素。对于3维图像阵列,定义了图像个数(depth)以及填充区域大小(width,height);对于2维图像阵列对象,定义了填充区域(width,height);对于1维图像阵列对象,定义了填充区域(width)。如果image是2维图像对象或1维图像阵列对象,region[2]必须是1。如果image是1维图像对象或1维图像缓冲区对象,region[1]和region[2]都必须是0。 -
参数image_row_pitch为所映射区域的扫描列间距,单位为字节,不能为NULL。
-
参数image_slice_pitch,对于3维图像而言是2维平面的大小,对于1维图像或2维图像阵列而言分别是每个1维或2维图像的大小。对于1维或2维图像,如果此参数不是NULL则返回零。对于3维图像、1维或2维图像阵列,image_slice_pitch不能为NULL。
函数clEnqueueMapImage实现把图像对象映射到主机可访问的内存区域。
如下代码实现了把2维大小为width*height的图像对象imageObjects映射到主机内存:
……
//创建2维图像
cl_image_desc desc;
memset(&desc, 0, sizeof(desc));
desc.image_type = CL_MEM_OBJECT_IMAGE2D;
desc.image_width = width;
desc.image_height = height;
cl_image_format rgb_format;
rgb_format.image_channel_order = CL_RGB;
rgb_format.image_channel_data_type = CL_UNSIGNED_INT8;
cl_mem d_inputImage = clCreateImage(context, CL_MEM_READ_WRITE |
CL_MEM_ALLOC_HOST_PTR,
&rgb_format, &desc, NULL,
&status);
//映射
size_t origin[3] = {0, 0, 0};
size_t region[3] = { width, height, 1};
size_t image_row_pitch = width;
size_t image_slice_pitch = width * height;
unsigned char *data = (unsigned char *)clEnqueueMapImage(
commandQueue,
imageObjects, CL_TRUE,
CL_MAP_WRITE, origin, region,
&image_row_pitch, & image_slice_pitch,
0, NULL, NULL, &err)
//对data写入操作
clEnqueueUnmapMemObject(commandQueue,
imageObjects, data, 0,
NULL, NULL);