@@ -278,6 +278,133 @@ TEST_F(EnqueueSvmTest, enqueueSVMMemcpy_InvalidValueSrcPtrIsNull) {
278278 EXPECT_EQ (CL_INVALID_VALUE, retVal);
279279}
280280
281+ TEST_F (EnqueueSvmTest, GivenSrcHostPtrAndEventWhenEnqueueSVMMemcpyThenEventCommandTypeIsCorrectlySet) {
282+ char srcHostPtr[260 ];
283+ void *pDstSVM = ptrSVM;
284+ void *pSrcSVM = srcHostPtr;
285+ cl_event event = nullptr ;
286+ retVal = this ->pCmdQ ->enqueueSVMMemcpy (
287+ false , // cl_bool blocking_copy
288+ pDstSVM, // void *dst_ptr
289+ pSrcSVM, // const void *src_ptr
290+ 256 , // size_t size
291+ 0 , // cl_uint num_events_in_wait_list
292+ nullptr , // cl_evebt *event_wait_list
293+ &event // cL_event *event
294+ );
295+ EXPECT_EQ (CL_SUCCESS, retVal);
296+ constexpr cl_command_type expectedCmd = CL_COMMAND_SVM_MEMCPY;
297+ cl_command_type actualCmd = castToObjectOrAbort<Event>(event)->getCommandType ();
298+ EXPECT_EQ (expectedCmd, actualCmd);
299+ clReleaseEvent (event);
300+ }
301+
302+ TEST_F (EnqueueSvmTest, GivenSrcHostPtrAndSizeZeroWhenEnqueueSVMMemcpyThenReturnSuccess) {
303+ char srcHostPtr[260 ];
304+ void *pDstSVM = ptrSVM;
305+ void *pSrcSVM = srcHostPtr;
306+ retVal = this ->pCmdQ ->enqueueSVMMemcpy (
307+ false , // cl_bool blocking_copy
308+ pDstSVM, // void *dst_ptr
309+ pSrcSVM, // const void *src_ptr
310+ 0 , // size_t size
311+ 0 , // cl_uint num_events_in_wait_list
312+ nullptr , // cl_evebt *event_wait_list
313+ nullptr // cL_event *event
314+ );
315+ EXPECT_EQ (CL_SUCCESS, retVal);
316+ }
317+
318+ HWTEST_F (EnqueueSvmTest, GivenSrcHostPtrWhenEnqueueSVMMemcpyThenEnqueuWriteBufferIsCalled) {
319+ char srcHostPtr[260 ];
320+ void *pSrcSVM = srcHostPtr;
321+ void *pDstSVM = ptrSVM;
322+ MockCommandQueueHw<FamilyType> myCmdQ (context, pDevice, 0 );
323+ retVal = myCmdQ.enqueueSVMMemcpy (
324+ false , // cl_bool blocking_copy
325+ pDstSVM, // void *dst_ptr
326+ pSrcSVM, // const void *src_ptr
327+ 256 , // size_t size
328+ 0 , // cl_uint num_events_in_wait_list
329+ nullptr , // cl_evebt *event_wait_list
330+ nullptr // cL_event *event
331+ );
332+ EXPECT_EQ (CL_SUCCESS, retVal);
333+ EXPECT_EQ (myCmdQ.lastCommandType , static_cast <cl_command_type>(CL_COMMAND_WRITE_BUFFER));
334+ }
335+
336+ HWTEST_F (EnqueueSvmTest, GivenDstHostPtrWhenEnqueueSVMMemcpyThenEnqueuReadBufferIsCalled) {
337+ char dstHostPtr[260 ];
338+ void *pDstSVM = dstHostPtr;
339+ void *pSrcSVM = ptrSVM;
340+ MockCommandQueueHw<FamilyType> myCmdQ (context, pDevice, 0 );
341+ retVal = myCmdQ.enqueueSVMMemcpy (
342+ false , // cl_bool blocking_copy
343+ pDstSVM, // void *dst_ptr
344+ pSrcSVM, // const void *src_ptr
345+ 256 , // size_t size
346+ 0 , // cl_uint num_events_in_wait_list
347+ nullptr , // cl_evebt *event_wait_list
348+ nullptr // cL_event *event
349+ );
350+ EXPECT_EQ (CL_SUCCESS, retVal);
351+ EXPECT_EQ (myCmdQ.lastCommandType , static_cast <cl_command_type>(CL_COMMAND_READ_BUFFER));
352+ }
353+
354+ TEST_F (EnqueueSvmTest, GivenDstHostPtrAndEventWhenEnqueueSVMMemcpyThenEventCommandTypeIsCorrectlySet) {
355+ char dstHostPtr[260 ];
356+ void *pDstSVM = dstHostPtr;
357+ void *pSrcSVM = ptrSVM;
358+ cl_event event = nullptr ;
359+ retVal = this ->pCmdQ ->enqueueSVMMemcpy (
360+ false , // cl_bool blocking_copy
361+ pDstSVM, // void *dst_ptr
362+ pSrcSVM, // const void *src_ptr
363+ 256 , // size_t size
364+ 0 , // cl_uint num_events_in_wait_list
365+ nullptr , // cl_evebt *event_wait_list
366+ &event // cL_event *event
367+ );
368+ EXPECT_EQ (CL_SUCCESS, retVal);
369+ constexpr cl_command_type expectedCmd = CL_COMMAND_SVM_MEMCPY;
370+ cl_command_type actualCmd = castToObjectOrAbort<Event>(event)->getCommandType ();
371+ EXPECT_EQ (expectedCmd, actualCmd);
372+ clReleaseEvent (event);
373+ }
374+
375+ TEST_F (EnqueueSvmTest, GivenDstHostPtrAndSizeZeroWhenEnqueueSVMMemcpyThenReturnSuccess) {
376+ char dstHostPtr[260 ];
377+ void *pDstSVM = dstHostPtr;
378+ void *pSrcSVM = ptrSVM;
379+ retVal = this ->pCmdQ ->enqueueSVMMemcpy (
380+ false , // cl_bool blocking_copy
381+ pDstSVM, // void *dst_ptr
382+ pSrcSVM, // const void *src_ptr
383+ 0 , // size_t size
384+ 0 , // cl_uint num_events_in_wait_list
385+ nullptr , // cl_evebt *event_wait_list
386+ nullptr // cL_event *event
387+ );
388+ EXPECT_EQ (CL_SUCCESS, retVal);
389+ }
390+
391+ TEST_F (EnqueueSvmTest, GivenDstHostPtrAndSrcHostPtrWhenEnqueueSVMMemcpyThenReturnInvalidValue) {
392+ char dstHostPtr[260 ];
393+ char srcHostPtr[260 ];
394+ void *pDstSVM = dstHostPtr;
395+ void *pSrcSVM = srcHostPtr;
396+ retVal = this ->pCmdQ ->enqueueSVMMemcpy (
397+ false , // cl_bool blocking_copy
398+ pDstSVM, // void *dst_ptr
399+ pSrcSVM, // const void *src_ptr
400+ 256 , // size_t size
401+ 0 , // cl_uint num_events_in_wait_list
402+ nullptr , // cl_evebt *event_wait_list
403+ nullptr // cL_event *event
404+ );
405+ EXPECT_EQ (CL_INVALID_VALUE, retVal);
406+ }
407+
281408TEST_F (EnqueueSvmTest, enqueueSVMMemcpy_Success) {
282409 void *pDstSVM = ptrSVM;
283410 void *pSrcSVM = context->getSVMAllocsManager ()->createSVMAlloc (256 , {});
@@ -915,3 +1042,53 @@ HWTEST_F(EnqueueSvmTestLocalMemory, givenEnabledLocalMemoryWhenMappedSvmRegionAn
9151042 auto walkerCount = hwParse.getCommandCount <WALKER_TYPE>();
9161043 EXPECT_EQ (2u , walkerCount);
9171044}
1045+
1046+ template <typename GfxFamily>
1047+ struct FailCsr : public CommandStreamReceiverHw <GfxFamily> {
1048+ FailCsr (ExecutionEnvironment &executionEnvironment) : CommandStreamReceiverHw<GfxFamily>(executionEnvironment){};
1049+ bool createAllocationForHostSurface (HostPtrSurface &surface, bool requiresL3Flush) override {
1050+ return CL_FALSE;
1051+ }
1052+ };
1053+
1054+ HWTEST_F (EnqueueSvmTest, GivenDstHostPtrWhenHostPtrAllocationCreationFailsThenReturnOutOfResource) {
1055+ char dstHostPtr[260 ];
1056+ void *pDstSVM = dstHostPtr;
1057+ void *pSrcSVM = ptrSVM;
1058+ MockCommandQueueHw<FamilyType> cmdQ (context, pDevice, nullptr );
1059+ auto failCsr = std::make_unique<FailCsr<FamilyType>>(*pDevice->getExecutionEnvironment ());
1060+ CommandStreamReceiver *oldCommandStreamReceiver = cmdQ.engine ->commandStreamReceiver ;
1061+ cmdQ.engine ->commandStreamReceiver = failCsr.get ();
1062+ retVal = cmdQ.enqueueSVMMemcpy (
1063+ false , // cl_bool blocking_copy
1064+ pDstSVM, // void *dst_ptr
1065+ pSrcSVM, // const void *src_ptr
1066+ 256 , // size_t size
1067+ 0 , // cl_uint num_events_in_wait_list
1068+ nullptr , // cl_evebt *event_wait_list
1069+ nullptr // cL_event *event
1070+ );
1071+ EXPECT_EQ (CL_OUT_OF_RESOURCES, retVal);
1072+ cmdQ.engine ->commandStreamReceiver = oldCommandStreamReceiver;
1073+ }
1074+
1075+ HWTEST_F (EnqueueSvmTest, GivenSrcHostPtrAndSizeZeroWhenHostPtrAllocationCreationFailsThenReturnOutOfResource) {
1076+ char srcHostPtr[260 ];
1077+ void *pDstSVM = ptrSVM;
1078+ void *pSrcSVM = srcHostPtr;
1079+ MockCommandQueueHw<FamilyType> cmdQ (context, pDevice, nullptr );
1080+ auto failCsr = std::make_unique<FailCsr<FamilyType>>(*pDevice->getExecutionEnvironment ());
1081+ CommandStreamReceiver *oldCommandStreamReceiver = cmdQ.engine ->commandStreamReceiver ;
1082+ cmdQ.engine ->commandStreamReceiver = failCsr.get ();
1083+ retVal = cmdQ.enqueueSVMMemcpy (
1084+ false , // cl_bool blocking_copy
1085+ pDstSVM, // void *dst_ptr
1086+ pSrcSVM, // const void *src_ptr
1087+ 256 , // size_t size
1088+ 0 , // cl_uint num_events_in_wait_list
1089+ nullptr , // cl_evebt *event_wait_list
1090+ nullptr // cL_event *event
1091+ );
1092+ EXPECT_EQ (CL_OUT_OF_RESOURCES, retVal);
1093+ cmdQ.engine ->commandStreamReceiver = oldCommandStreamReceiver;
1094+ }
0 commit comments