1 #ifndef OPENCL_BUFFER_H 2 #define OPENCL_BUFFER_H 4 #include "opencl_context.h" 5 #include "opencl_commandqueue.h" 6 #include "opencl_event.h" 7 #include "opencl_common.h" 8 #include "eexception.h" 40 const T&
at(
int index)
const;
56 cl_mem* _id {
nullptr};
71 cl_command_queue _last;
76 cl_map_flags _mapping;
100 _mapping = other._mapping;
126 e.setTitle(QObject::tr(
"Logic Error"));
127 e.setDetails(QObject::tr(
"Cannot access data from unmapped OpenCL buffer."));
130 if ( _mapping != CL_MAP_WRITE )
133 e.setTitle(QObject::tr(
"Logic Error"));
134 e.setDetails(QObject::tr(
"Cannot write data to OpenCL buffer mapped for reading."));
137 if ( index < 0 || index >= _size )
140 e.setTitle(QObject::tr(
"Out Of Range"));
141 e.setDetails(QObject::tr(
"The index %1 is out of range for this OpenCL buffer (%2 size).")
170 *_id = clCreateBuffer(context->
id(),CL_MEM_READ_WRITE,
sizeof(T)*_size,
nullptr,&code);
171 if ( code != CL_SUCCESS )
196 _mapping(other._mapping)
237 e.setTitle(QObject::tr(
"Logic Error"));
238 e.setDetails(QObject::tr(
"Cannot access data from unmapped OpenCL buffer."));
241 if ( _mapping != CL_MAP_READ )
244 e.setTitle(QObject::tr(
"Logic Error"));
245 e.setDetails(QObject::tr(
"Cannot read data from OpenCL buffer mapped for writing."));
248 if ( index < 0 || index >= _size )
251 e.setTitle(QObject::tr(
"Out Of Range"));
252 e.setDetails(QObject::tr(
"The index %1 is out of range for this OpenCL buffer (%2 size).")
293 e.setTitle(QObject::tr(
"Logic Error"));
294 e.setDetails(QObject::tr(
"Cannot return OpenCL buffer ID of null object."));
336 return map(queue,CL_MAP_READ);
358 return map(queue,CL_MAP_WRITE);
384 e.setTitle(QObject::tr(
"Logic Error"));
385 e.setDetails(QObject::tr(
"Cannot unmap OpenCL buffer that is null."));
391 e.setTitle(QObject::tr(
"Logic Error"));
392 e.setDetails(QObject::tr(
"Cannot unmap OpenCL buffer that is not mapped."));
399 clEnqueueUnmapMemObject(queue->
id(),*_id,_data,0,
nullptr,&id);
405 cl_int code = {clReleaseCommandQueue(_last)};
406 if ( code != CL_SUCCESS )
435 e.setTitle(QObject::tr(
"Logic Error"));
436 e.setDetails(QObject::tr(
"Cannot access data from unmapped OpenCL buffer."));
465 e.setTitle(QObject::tr(
"Logic Error"));
466 e.setDetails(QObject::tr(
"Cannot unmap OpenCL buffer that is null."));
472 e.setTitle(QObject::tr(
"Logic Error"));
473 e.setDetails(QObject::tr(
"Cannot map OpenCL buffer that is already mapped."));
481 _data =
static_cast<T*
>(clEnqueueMapBuffer(queue->
id()
491 if ( code != CL_SUCCESS )
502 code = clRetainCommandQueue(_last);
503 if ( code != CL_SUCCESS )
523 template<
class T>
void Buffer<T>::clear()
532 clEnqueueUnmapMemObject(_last,*_id,_data,0,
nullptr,
nullptr);
533 clReleaseCommandQueue(_last);
537 clReleaseMemObject(*_id);
551 template<
class T>
void Buffer<T>::nullify()
T * data()
Definition: opencl_buffer.h:428
const T & at(int index) const
Definition: opencl_buffer.h:229
~Buffer()
Definition: opencl_buffer.h:209
Event mapRead(CommandQueue *queue)
Definition: opencl_buffer.h:334
bool isNull() const
Definition: opencl_buffer.h:270
Definition: opencl_context.h:18
Definition: opencl_buffer.h:27
int size() const
Definition: opencl_buffer.h:312
cl_command_queue id() const
Definition: opencl_commandqueue.cpp:76
Definition: opencl_commandqueue.h:18
T & operator[](int index)
Definition: opencl_buffer.h:118
Definition: opencl_event.h:18
Event unmap(CommandQueue *queue)
Definition: opencl_buffer.h:377
cl_mem id() const
Definition: opencl_buffer.h:286
cl_context id() const
Definition: opencl_context.cpp:93
void fillException(EException *exception, cl_int code)
Definition: opencl_common.cpp:24
void operator=(Buffer< T > &&other)
Definition: opencl_buffer.h:91
Event mapWrite(CommandQueue *queue)
Definition: opencl_buffer.h:356