@@ -390,31 +390,46 @@ void buffer_impl<AllocatorT>::moveMemoryTo(
390
390
Event->setIsHostEvent (false );
391
391
392
392
OCLState.Queue = std::move (Queue);
393
- OCLState.Mem = nullptr ;
394
393
return ;
395
394
}
396
395
// Copy from host to OCL device.
397
396
if (OCLState.Queue ->is_host () && !Queue->is_host ()) {
398
- const size_t ByteSize = get_size ();
397
+ if (nullptr == BufPtr) {
398
+ return ;
399
+ }
400
+
399
401
cl_int Error;
400
- cl_mem Mem =
401
- clCreateBuffer (Context->getHandleRef (), CL_MEM_READ_WRITE, ByteSize,
402
- /* host_ptr=*/ nullptr , &Error);
403
- CHECK_OCL_CODE (Error);
402
+ const size_t ByteSize = get_size ();
404
403
405
- OCLState.Queue = std::move (Queue);
406
- OCLState.Mem = Mem;
404
+ // We don't create new OpenCL buffer object to copy from OCL device to host
405
+ // when we already have them in OCLState. But if contexts of buffer object
406
+ // from OCLState and input Queue are not same - we should create new OpenCL
407
+ // buffer object.
408
+ bool NeedToCreateCLBuffer = true ;
409
+
410
+ if (OCLState.Mem != nullptr ) {
411
+ cl_context MemCtx;
412
+ Error = clGetMemObjectInfo (OCLState.Mem , CL_MEM_CONTEXT,
413
+ sizeof (cl_context), &MemCtx, nullptr );
414
+ CHECK_OCL_CODE (Error);
415
+ NeedToCreateCLBuffer = MemCtx != Context->getHandleRef ();
416
+ }
407
417
408
- // Just exit if nothing to read from host.
409
- if (nullptr == BufPtr) {
410
- return ;
418
+ if (NeedToCreateCLBuffer) {
419
+ OCLState.Mem =
420
+ clCreateBuffer (Context->getHandleRef (), CL_MEM_READ_WRITE, ByteSize,
421
+ /* host_ptr=*/ nullptr , &Error);
422
+ CHECK_OCL_CODE (Error);
411
423
}
424
+
425
+ OCLState.Queue = std::move (Queue);
426
+
412
427
std::vector<cl_event> CLEvents =
413
428
detail::getOrWaitEvents (std::move (DepEvents), Context);
414
429
cl_event &WriteBufEvent = Event->getHandleRef ();
415
430
// Enqueue copying from host to new OCL buffer.
416
431
Error =
417
- clEnqueueWriteBuffer (OCLState.Queue ->getHandleRef (), Mem,
432
+ clEnqueueWriteBuffer (OCLState.Queue ->getHandleRef (), OCLState. Mem ,
418
433
/* blocking_write=*/ CL_FALSE, /* offset=*/ 0 ,
419
434
ByteSize, BufPtr, CLEvents.size (), CLEvents.data (),
420
435
&WriteBufEvent); // replace &WriteBufEvent to NULL
0 commit comments