OpenCL 图像对象映射

可以使用如下函数来映射图像对象到主机内存区域:

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);

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程