@@ -262,7 +262,7 @@ template <typename AllocatorT> class buffer_impl {
262
262
263
263
public:
264
264
void moveMemoryTo (QueueImplPtr Queue, std::vector<cl::sycl::event> DepEvents,
265
- EventImplPtr Event);
265
+ EventImplPtr Event, cl::sycl::access::mode Mode );
266
266
267
267
void fill (QueueImplPtr Queue, std::vector<cl::sycl::event> DepEvents,
268
268
EventImplPtr Event, const void *Pattern, size_t PatternSize,
@@ -281,7 +281,7 @@ template <typename AllocatorT> class buffer_impl {
281
281
bool isValidAccessToMem (cl::sycl::access::mode AccessMode);
282
282
283
283
void allocate (QueueImplPtr Queue, std::vector<cl::sycl::event> DepEvents,
284
- EventImplPtr Event, cl::sycl::access::mode mode );
284
+ EventImplPtr Event);
285
285
286
286
cl_mem getOpenCLMem () const ;
287
287
@@ -409,7 +409,7 @@ void buffer_impl<AllocatorT>::copy(
409
409
template <typename AllocatorT>
410
410
void buffer_impl<AllocatorT>::moveMemoryTo(
411
411
QueueImplPtr Queue, std::vector<cl::sycl::event> DepEvents,
412
- EventImplPtr Event) {
412
+ EventImplPtr Event, cl::sycl::access::mode Mode ) {
413
413
414
414
ContextImplPtr Context = detail::getSyclObjImpl (Queue->get_context ());
415
415
@@ -431,6 +431,10 @@ void buffer_impl<AllocatorT>::moveMemoryTo(
431
431
432
432
// Copy from OCL device to host device.
433
433
if (!OCLState.Queue ->is_host () && Queue->is_host ()) {
434
+ if (Mode == cl::sycl::access ::mode::discard_write &&
435
+ Mode == cl::sycl::access ::mode::discard_read_write)
436
+ return ;
437
+
434
438
const size_t ByteSize = get_size ();
435
439
436
440
std::vector<cl_event> CLEvents =
@@ -484,13 +488,18 @@ void buffer_impl<AllocatorT>::moveMemoryTo(
484
488
485
489
std::vector<cl_event> CLEvents =
486
490
detail::getOrWaitEvents (std::move (DepEvents), Context);
491
+ if (Mode == cl::sycl::access ::mode::discard_write &&
492
+ Mode == cl::sycl::access ::mode::discard_read_write)
493
+ return ;
494
+
487
495
cl_event &WriteBufEvent = Event->getHandleRef ();
488
496
// Enqueue copying from host to new OCL buffer.
489
497
Error =
490
498
clEnqueueWriteBuffer (OCLState.Queue ->getHandleRef (), OCLState.Mem ,
491
499
/* blocking_write=*/ CL_FALSE, /* offset=*/ 0 ,
492
- ByteSize, BufPtr, CLEvents.size (), CLEvents.data (),
493
- &WriteBufEvent); // replace &WriteBufEvent to NULL
500
+ ByteSize, BufPtr, CLEvents.size (),
501
+ CLEvents.data (), /* replace &WriteBufEvent
502
+ to NULL*/ &WriteBufEvent);
494
503
CHECK_OCL_CODE (Error);
495
504
Event->setContextImpl (Context);
496
505
@@ -507,8 +516,10 @@ buffer_impl<AllocatorT>::convertSycl2OCLMode(cl::sycl::access::mode mode) {
507
516
case cl::sycl::access ::mode::read :
508
517
return CL_MEM_READ_ONLY;
509
518
case cl::sycl::access ::mode::write :
519
+ case cl::sycl::access ::mode::discard_write:
510
520
return CL_MEM_WRITE_ONLY;
511
521
case cl::sycl::access ::mode::read_write:
522
+ case cl::sycl::access ::mode::discard_read_write:
512
523
case cl::sycl::access ::mode::atomic:
513
524
return CL_MEM_READ_WRITE;
514
525
default :
@@ -534,8 +545,7 @@ bool buffer_impl<AllocatorT>::isValidAccessToMem(
534
545
template <typename AllocatorT>
535
546
void buffer_impl<AllocatorT>::allocate(QueueImplPtr Queue,
536
547
std::vector<cl::sycl::event> DepEvents,
537
- EventImplPtr Event,
538
- cl::sycl::access::mode mode) {
548
+ EventImplPtr Event) {
539
549
540
550
detail::waitEvents (DepEvents);
541
551
@@ -556,7 +566,7 @@ void buffer_impl<AllocatorT>::allocate(QueueImplPtr Queue,
556
566
cl_int Error;
557
567
558
568
cl_mem Mem =
559
- clCreateBuffer (Context->getHandleRef (), convertSycl2OCLMode (mode) ,
569
+ clCreateBuffer (Context->getHandleRef (), CL_MEM_READ_WRITE ,
560
570
ByteSize, nullptr , &Error);
561
571
CHECK_OCL_CODE (Error);
562
572
0 commit comments