/** * \brief ocl::Image::copyToAsync Copies asynchronously from this Image to the destination Image. * * \param queue is a command queue on which the command is executed. * \param src_origin is the 3D offset in bytes from which the Image is read. * \param region is the 3D region of the data. It is given with {image_width, image_height, image_depth}. * \param dest is the Image into which the data is going to be copied. * \param dest_origin is the 3D offset in bytes from which the destionation Image is read. * \param list contains all events for which this command has to wait. * \return event which can be integrated into other EventList. */ ocl::Event ocl::Image::copyToAsync(const Queue &queue, size_t *src_origin, const size_t *region, const Image &dest, size_t *dest_origin, const EventList &list) { TRUE_ASSERT(this->context() == dest.context(), "Context of this and dest must be equal"); TRUE_ASSERT(queue.context() == *this->context(), "Context of queue and this must be equal"); cl_event event_id; OPENCL_SAFE_CALL( clEnqueueCopyImage(queue.id(), this->id(), dest.id(), src_origin, dest_origin, region, list.size(), list.events().data(), &event_id) ); return ocl::Event(event_id, this->context()); }
/** * \brief ocl::Image::copyToAsync Copies asynchronously from this Image to the destination Image. * * \param src_origin is the 3D offset in bytes from which the Image is read. * \param region is the 3D region of the data. It is given with {image_width, image_height, image_depth}. * \param dest is the Image into which the data is going to be copied. * \param dest_origin is the 3D offset in bytes from which the destionation Image is read. * \param list contains all events for which this command has to wait. * \return event which can be integrated into other EventList. */ ocl::Event ocl::Image::copyToAsync(size_t *src_origin, const size_t *region, const Image &dest, size_t *dest_origin, const EventList &list) { TRUE_ASSERT(this->context() == dest.context(), "Context of this and dest must be equal"); TRUE_ASSERT(this->id() != dest.id(), "Images must not be equal this->id() " << this->id() << "; other.id " << dest.id()); cl_event event_id; OPENCL_SAFE_CALL( clEnqueueCopyImage(this->activeQueue().id(), this->id(), dest.id(), src_origin, dest_origin, region, list.size(), list.events().data(), &event_id) ); return ocl::Event(event_id, this->context()); }
/** * \brief ocl::Image::map Maps the Image into the host memory. * * No data transfer is performed. Note that in order to map data of the Image the active queue must be a cpu and must have been allocated * with the Image access mode AllocHost. You cannot modify the Image with OpenCL until unmap. * \param ptr is returned and contains the address of a pointer to the host memory. * \param origin is the 3D offset in bytes from which the image is read. * \param region is the 3D region in bytes to be mapped. * \param access specifies in what way the host_mem is used. * \param list contains all events for which this command has to wait. * \return event which can be integrated into other EventList */ ocl::Event ocl::Image::mapAsync(void **ptr, size_t *origin, const size_t *region, Memory::Access access, const EventList &list) const { TRUE_ASSERT(this->activeQueue().device().isCpu(), "Device " << this->activeQueue().device().name() << " is not a cpu!"); cl_int status; cl_event event_id; cl_map_flags flags = access; *ptr = clEnqueueMapImage(this->activeQueue().id(), this->id(), CL_TRUE, flags, origin, region, 0, 0, list.size(), list.events().data(), &event_id, &status); OPENCL_SAFE_CALL (status ) ; TRUE_ASSERT(ptr != NULL, "Could not map image!"); return ocl::Event(event_id, this->context()); }
/*! \brief Blocks until all commands in this Queue are issued to the associated device and have completed. * * clFinish does not return until all previously queued commands in command_queue have been processed and completed. */ void ocl::Queue::barrier(const EventList& list ) const { OPENCL_SAFE_CALL( clEnqueueBarrierWithWaitList (this->id(), list.size(), list.events().data(), 0) ); }
/*! \brief Releases access to this Image. * * Access is released to this Image. * \param q is the active OpenCL queue. * \returns whether releasing was successful or not. */ void ocl::Image::releaseAccess(Queue &q, const EventList& list) { cl_event event_id; OPENCL_SAFE_CALL( clEnqueueReleaseGLObjects(q.id(), 1, &this->_id, list.size(), list.events().data(), &event_id) ); }
/** * \brief ocl::Image::writeAsync Transfers data from host memory to this Image. * * Waits until the event list is completed. Be sure that the queue * and this Image are in the same context. * \param queue is a command queue on which the command is executed. * \param origin is the 3D offset in bytes from which the Image is read. * \param ptr_to_host_data must point to a memory location whith region bytes available. * \param region is the 3D region of the data. It is given with {image_width, image_height, image_depth}. * \param list contains all events for which this command has to wait. * \return an event which can be further put into an event list for synchronization. */ ocl::Event ocl::Image::writeAsync(const Queue &queue, size_t *origin, const void *ptr_to_host_data, const size_t *region, const EventList &list) const { TRUE_ASSERT(ptr_to_host_data != NULL, "data == 0"); TRUE_ASSERT(queue.context() == *this->context(), "Context of queue and this must be equal"); cl_event event_id; OPENCL_SAFE_CALL( clEnqueueWriteImage(queue.id(), this->id(), CL_FALSE, origin, region, 0, 0, ptr_to_host_data, list.size(), list.events().data(), &event_id) ); return ocl::Event(event_id, this->context()); }
/** * \brief ocl::Image::write Transfers data from host memory to this Image. * * You can be sure that the data is read. Be sure that the queue * and this Image are in the same context. * \param queue is a command queue on which the command is executed. * \param ptr_to_host_data must point to a memory location whith region bytes available. * \param region is the 3D region of the data. It is given with {image_width, image_height, image_depth}. */ void ocl::Image::write(const Queue& queue, const void *ptr_to_host_data, const size_t *region, const EventList &list) const { TRUE_ASSERT(ptr_to_host_data != NULL, "data == 0"); TRUE_ASSERT(queue.context() == *this->context(), "Context of queue and this must be equal"); std::vector<size_t> origin = {0, 0, 0}; OPENCL_SAFE_CALL( clEnqueueWriteImage(queue.id(), this->id(), CL_TRUE, origin.data(), region, 0, 0, ptr_to_host_data, list.size(), list.events().data(), NULL) ); OPENCL_SAFE_CALL( clFinish(queue.id()) ); }
/** * \brief ocl::Image::writeAsync Transfers data from host memory to this Image. * * Waits until the event list is completed. * \param origin is the 3D offset in bytes from which the Image is read. * \param ptr_to_host_data must point to a memory location whith region bytes available. * \param region is the 3D region of the data. It is given with {image_width, image_height, image_depth}. * \param list contains all events for which this command has to wait. * \return an event which can be further put into an event list for synchronization. */ ocl::Event ocl::Image::writeAsync(size_t *origin, const void *ptr_to_host_data, const size_t *region, const EventList &list) const { TRUE_ASSERT(ptr_to_host_data != NULL, "data == 0"); cl_event event_id; OPENCL_SAFE_CALL( clEnqueueWriteImage(this->activeQueue().id(), this->id(), CL_FALSE, origin, region, 0, 0, ptr_to_host_data, list.size(), list.events().data(), &event_id) ); return ocl::Event(event_id, this->context()); }
/** * \brief ocl::Image::write Transfers data from host memory to this Image. * * You can be sure that the data is write. * \param ptr_to_host_data must point to a memory location whith region bytes available. * \param region is the 3D region of the data. It is given with {image_width, image_height, image_depth}. */ void ocl::Image::write(const void *ptr_to_host_data, const size_t *region, const EventList &list) const { TRUE_ASSERT(ptr_to_host_data != NULL, "data == 0"); std::vector<size_t> origin = {0, 0, 0}; OPENCL_SAFE_CALL( clEnqueueWriteImage(this->activeQueue().id(), this->id(), CL_TRUE, origin.data(), region, 0, 0, ptr_to_host_data, list.size(), list.events().data(), NULL) ); OPENCL_SAFE_CALL( clFinish(this->activeQueue().id()) ); }
/** * \brief ocl::Image::read Transfers data from this Image to the host memory. * * You can be sure that the data is read. * \param origin is the 3D offset in bytes from which the Image is read. * \param ptr_to_host_data must point to a memory location whith region bytes available. * \param region is the 3D region of the data. It is given with {image_width, image_height, image_depth}. */ void ocl::Image::read(size_t *origin, void *ptr_to_host_data, const size_t *region, const EventList &list) const { TRUE_ASSERT(ptr_to_host_data != NULL, "data == 0"); OPENCL_SAFE_CALL( clEnqueueReadImage(this->activeQueue().id(), this->id(), CL_TRUE, origin, region, 0, 0, ptr_to_host_data, list.size(), list.events().data(), NULL) ); OPENCL_SAFE_CALL( clFinish(this->activeQueue().id()) ); }
/** * \brief ocl::Image::copyTo Copies from this Image to the destination Image. * * The operation assumes that all data are valid and no synchronization is necessary (active Queue executes in-order). * The operation forces that all commands within the active Queue including this one are completed. * * \param queue is a command queue on which the command is executed. * \param src_origin is the 3D offset in bytes from which the Image is read. * \param region is the 3D region of the data. It is given with {image_width, image_height, image_depth}. * \param dest is the Image into which the data is going to be copied. * \param dest_origin is the 3D offset in bytes from which the destionation Image is read. */ void ocl::Image::copyTo(const Queue &queue, size_t *src_origin, const size_t *region, const Image &dest, size_t *dest_origin, const EventList &list) const { TRUE_ASSERT(this->context() == dest.context(), "Context of this and dest must be equal"); TRUE_ASSERT(this->id() != dest.id(), "Image must not be equal this->id() " << this->id() << "; other.id " << dest.id()); TRUE_ASSERT(queue.context() == *this->context(), "Context of queue and this must be equal"); OPENCL_SAFE_CALL( clEnqueueCopyImage(queue.id(), this->id(), dest.id(), src_origin, dest_origin, region, list.size(), list.events().data(), NULL) ); OPENCL_SAFE_CALL( clFinish(this->activeQueue().id()) ); }