图像对象和缓冲区对象都是用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);
……