@@ -123,3 +123,151 @@ HWTEST_F(EnqueueSvmMemCopyTest, givenEnqueueSVMMemcpyWhenUsingCopyBufferToBuffer
123123 auto kernel = mdi->begin ()->getKernel ();
124124 EXPECT_EQ (" CopyBufferToBufferMiddle" , kernel->getKernelInfo ().name );
125125}
126+
127+ HWTEST_F (EnqueueSvmMemCopyTest, givenEnqueueSVMMemcpyWhenUsingCopyBufferToBufferBuilderAndSrcHostPtrThenItConfiguredWithBuiltinOpsAndProducesDispatchInfo) {
128+ auto &builtIns = *pCmdQ->getDevice ().getExecutionEnvironment ()->getBuiltIns ();
129+ void *srcHostPtr = alignedMalloc (256 , 64 );
130+
131+ // retrieve original builder
132+ auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder (
133+ EBuiltInOps::CopyBufferToBuffer,
134+ pCmdQ->getContext (),
135+ pCmdQ->getDevice ());
136+ ASSERT_NE (nullptr , &origBuilder);
137+
138+ // substitute original builder with mock builder
139+ auto oldBuilder = builtIns.setBuiltinDispatchInfoBuilder (
140+ EBuiltInOps::CopyBufferToBuffer,
141+ pCmdQ->getContext (),
142+ pCmdQ->getDevice (),
143+ std::unique_ptr<NEO::BuiltinDispatchInfoBuilder>(new MockBuiltinDispatchInfoBuilder (builtIns, &origBuilder)));
144+ EXPECT_EQ (&origBuilder, oldBuilder.get ());
145+
146+ // call enqueue on mock builder
147+ auto retVal = pCmdQ->enqueueSVMMemcpy (
148+ false , // cl_bool blocking_copy
149+ dstSvmPtr, // void *dst_ptr
150+ srcHostPtr, // const void *src_ptr
151+ 256 , // size_t size
152+ 0 , // cl_uint num_events_in_wait_list
153+ nullptr , // cl_event *event_wait_list
154+ nullptr // cL_event *event
155+ );
156+ EXPECT_EQ (CL_SUCCESS, retVal);
157+
158+ // restore original builder and retrieve mock builder
159+ auto newBuilder = builtIns.setBuiltinDispatchInfoBuilder (
160+ EBuiltInOps::CopyBufferToBuffer,
161+ pCmdQ->getContext (),
162+ pCmdQ->getDevice (),
163+ std::move (oldBuilder));
164+ EXPECT_NE (nullptr , newBuilder);
165+
166+ // check if original builder is restored correctly
167+ auto &restoredBuilder = builtIns.getBuiltinDispatchInfoBuilder (
168+ EBuiltInOps::CopyBufferToBuffer,
169+ pCmdQ->getContext (),
170+ pCmdQ->getDevice ());
171+ EXPECT_EQ (&origBuilder, &restoredBuilder);
172+
173+ // use mock builder to validate builder's input / output
174+ auto mockBuilder = static_cast <MockBuiltinDispatchInfoBuilder *>(newBuilder.get ());
175+
176+ // validate builder's input - builtin ops
177+ auto params = mockBuilder->getBuiltinOpParams ();
178+ EXPECT_EQ (srcHostPtr, params->srcPtr );
179+ EXPECT_EQ (dstSvmPtr, params->dstPtr );
180+ EXPECT_EQ (nullptr , params->srcMemObj );
181+ EXPECT_EQ (nullptr , params->dstMemObj );
182+ EXPECT_EQ (nullptr , params->srcSvmAlloc );
183+ EXPECT_EQ (dstSvmAlloc, params->dstSvmAlloc );
184+ EXPECT_EQ (Vec3<size_t >(0 , 0 , 0 ), params->srcOffset );
185+ EXPECT_EQ (Vec3<size_t >(0 , 0 , 0 ), params->dstOffset );
186+ EXPECT_EQ (Vec3<size_t >(256 , 0 , 0 ), params->size );
187+
188+ // validate builder's output - multi dispatch info
189+ auto mdi = mockBuilder->getMultiDispatchInfo ();
190+ EXPECT_EQ (1u , mdi->size ());
191+
192+ auto di = mdi->begin ();
193+ size_t middleElSize = 4 * sizeof (uint32_t );
194+ EXPECT_EQ (Vec3<size_t >(256 / middleElSize, 1 , 1 ), di->getGWS ());
195+
196+ auto kernel = mdi->begin ()->getKernel ();
197+ EXPECT_EQ (" CopyBufferToBufferMiddle" , kernel->getKernelInfo ().name );
198+ alignedFree (srcHostPtr);
199+ }
200+
201+ HWTEST_F (EnqueueSvmMemCopyTest, givenEnqueueSVMMemcpyWhenUsingCopyBufferToBufferBuilderAndDstHostPtrThenItConfiguredWithBuiltinOpsAndProducesDispatchInfo) {
202+ auto &builtIns = *pCmdQ->getDevice ().getExecutionEnvironment ()->getBuiltIns ();
203+ auto dstHostPtr = alignedMalloc (256 , 64 );
204+
205+ // retrieve original builder
206+ auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder (
207+ EBuiltInOps::CopyBufferToBuffer,
208+ pCmdQ->getContext (),
209+ pCmdQ->getDevice ());
210+ ASSERT_NE (nullptr , &origBuilder);
211+
212+ // substitute original builder with mock builder
213+ auto oldBuilder = builtIns.setBuiltinDispatchInfoBuilder (
214+ EBuiltInOps::CopyBufferToBuffer,
215+ pCmdQ->getContext (),
216+ pCmdQ->getDevice (),
217+ std::unique_ptr<NEO::BuiltinDispatchInfoBuilder>(new MockBuiltinDispatchInfoBuilder (builtIns, &origBuilder)));
218+ EXPECT_EQ (&origBuilder, oldBuilder.get ());
219+
220+ // call enqueue on mock builder
221+ auto retVal = pCmdQ->enqueueSVMMemcpy (
222+ false , // cl_bool blocking_copy
223+ dstHostPtr, // void *dst_ptr
224+ srcSvmPtr, // const void *src_ptr
225+ 256 , // size_t size
226+ 0 , // cl_uint num_events_in_wait_list
227+ nullptr , // cl_event *event_wait_list
228+ nullptr // cL_event *event
229+ );
230+ EXPECT_EQ (CL_SUCCESS, retVal);
231+
232+ // restore original builder and retrieve mock builder
233+ auto newBuilder = builtIns.setBuiltinDispatchInfoBuilder (
234+ EBuiltInOps::CopyBufferToBuffer,
235+ pCmdQ->getContext (),
236+ pCmdQ->getDevice (),
237+ std::move (oldBuilder));
238+ EXPECT_NE (nullptr , newBuilder);
239+
240+ // check if original builder is restored correctly
241+ auto &restoredBuilder = builtIns.getBuiltinDispatchInfoBuilder (
242+ EBuiltInOps::CopyBufferToBuffer,
243+ pCmdQ->getContext (),
244+ pCmdQ->getDevice ());
245+ EXPECT_EQ (&origBuilder, &restoredBuilder);
246+
247+ // use mock builder to validate builder's input / output
248+ auto mockBuilder = static_cast <MockBuiltinDispatchInfoBuilder *>(newBuilder.get ());
249+
250+ // validate builder's input - builtin ops
251+ auto params = mockBuilder->getBuiltinOpParams ();
252+ EXPECT_EQ (srcSvmPtr, params->srcPtr );
253+ EXPECT_EQ (dstHostPtr, params->dstPtr );
254+ EXPECT_EQ (nullptr , params->srcMemObj );
255+ EXPECT_EQ (nullptr , params->dstMemObj );
256+ EXPECT_EQ (srcSvmAlloc, params->srcSvmAlloc );
257+ EXPECT_EQ (nullptr , params->dstSvmAlloc );
258+ EXPECT_EQ (Vec3<size_t >(0 , 0 , 0 ), params->srcOffset );
259+ EXPECT_EQ (Vec3<size_t >(0 , 0 , 0 ), params->dstOffset );
260+ EXPECT_EQ (Vec3<size_t >(256 , 0 , 0 ), params->size );
261+
262+ // validate builder's output - multi dispatch info
263+ auto mdi = mockBuilder->getMultiDispatchInfo ();
264+ EXPECT_EQ (1u , mdi->size ());
265+
266+ auto di = mdi->begin ();
267+ size_t middleElSize = 4 * sizeof (uint32_t );
268+ EXPECT_EQ (Vec3<size_t >(256 / middleElSize, 1 , 1 ), di->getGWS ());
269+
270+ auto kernel = mdi->begin ()->getKernel ();
271+ EXPECT_EQ (" CopyBufferToBufferMiddle" , kernel->getKernelInfo ().name );
272+ alignedFree (dstHostPtr);
273+ }
0 commit comments