Event CommandQueue::enqueueUnmap(const Image3D& image, void *mappedPtr,
                                     const Epic::Core::Array<Event>& eventWaitList) const
    {
        Event ret;
        cl_int err = 0;
        Array<cl_event> events = eventArrayToCLEventArray(eventWaitList);

        err = clEnqueueUnmapMemObject(queueHandle(), image.imageHandle(), mappedPtr,
                                      events.count(), events.data(), ret.eventPointer());

        EPIC_OPENCL_CHECK_ERROR(err)

        return ret;
    }
    Event CommandQueue::enqueueWriteImage(const Image3D& image, bool blockingRead, const size_t origin[3], const size_t region[3],
                                          size_t rowPitch, size_t slicePitch, void *pointer,
                                          const Epic::Core::Array<Event>& eventWaitList) const
    {
        Event ret;
        cl_int err = 0;
        Array<cl_event> events = eventArrayToCLEventArray(eventWaitList);

        err = clEnqueueWriteImage(queueHandle(), image.imageHandle(), blockingRead, origin, region, rowPitch, slicePitch,
                                  pointer, events.count(), events.data(), ret.eventPointer());

        EPIC_OPENCL_CHECK_ERROR(err)

        return ret;
    }