OpenCL 图像对象和缓冲区对象间数据拷贝

图像对象和缓冲区对象都是用cl_mem数据结构来表示,这两种不同的存储器对象之间也可以相互拷贝数据。使用如下函数可以实现相互间数据拷贝:

cl_int clEnqueueCopyImageToBuffer (cl_command_queue
                                          command_queue,
                                          cl_mem src_image,
                                          cl_mem dst_buffer,
                                          const size_t *src_origin,
                                          const size_t *region,
                                          size_t dst_offset,
                                          cl_uint num_events_in_wait_list,
                                          const cl_event *event_wait_list,
                                          cl_event *event)
cl_int clEnqueueCopyBufferToImage (cl_command_queue
                                          command_queue,
                                          cl_mem src_buffer,
                                          cl_mem dst_image,
                                          size_t src_offset,
                                          const size_t *dst_origin,
                                          const size_t *region,
                                          cl_uint num_events_in_wait_list,
                                          const cl_event *event_wait_list,
                                          cl_event *event)
  • 参数command_queue为拷贝命令入队的队列。command_queue、src_image和dst_buffer必须位于同一OpenCL上下文中。
  • 参数src_image/dst_image为一个有效的图像对象。
  • 参数dst_buffer/src_buffer为一个缓冲区对象。
  • 参数src_origin/ dst_origin定义了所要拷贝区域的起始位置(x,y,z),单位为像素。3维图像阵列,定义了图像个数(depth)以及填充区域大小(width,height);2维图像阵列对象,定义了填充区域(width,height);1维图像阵列对象,定义了填充区域(width)。
    如果image是2维图像对象,src_origin[2]必须是0;如果image为1维图像对象或1维图像缓冲区对象,src_origin[1]和src_origin[2]都必须是0;如果image是1维图像阵列对象,则src_origin[2]必须为0,src_origin[1]是图像在阵列中的索引;如果image是2维图像阵列对象,则src_origin[2]是图像在阵列中的索引。
  • 参数region定义了所拷贝区域的大小(width,height,depth),单位为像素。对于2维图像阵列对象,为(width,height)以及图像个数;对于1维图像阵列对象,为(width)以及图像个数。如果image是2维图像对象或1维图像阵列对象,region[2]必须是1。
    如果image是1维图像或2维图像缓冲区对象,region[1]和region[2]都必须是1。
  • 参数dst_offset/src_offset分别为源缓冲区对象dst_buffer和目的缓冲区对象sr_buffer中的起始位置。

如下代码实现了把2维大小为width*height灰度图像数据从图像对象imageObjects拷贝到缓冲区对象buffer:

……
size_t src_origin[3] = {0, 0, 0};
size_t region[3] = { width, height, 1};
clEnqueueCopyImageToBuffer(commandQueue, imageObjects, buffer,
                                src_origin,
                                region, 0, 0, NULL, NULL);
……

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程