11
11
#include " command_buffer.hpp"
12
12
#include " common.hpp"
13
13
14
- // / Stub implementations of UR experimental feature command-buffers
15
-
16
14
UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferCreateExp (
17
- [[maybe_unused]] ur_context_handle_t hContext,
18
- [[maybe_unused]] ur_device_handle_t hDevice,
15
+ ur_context_handle_t hContext, ur_device_handle_t hDevice,
19
16
[[maybe_unused]] const ur_exp_command_buffer_desc_t *pCommandBufferDesc,
20
- [[maybe_unused]] ur_exp_command_buffer_handle_t *phCommandBuffer) {
17
+ ur_exp_command_buffer_handle_t *phCommandBuffer) {
21
18
22
- cl_adapter::die (" Experimental Command-buffer feature is not "
23
- " implemented for OpenCL adapter." );
24
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
19
+ ur_queue_handle_t Queue = nullptr ;
20
+ UR_RETURN_ON_FAILURE (urQueueCreate (hContext, hDevice, nullptr , &Queue));
21
+
22
+ cl_context CLContext = cl_adapter::cast<cl_context>(hContext);
23
+ cl_ext::clCreateCommandBufferKHR_fn clCreateCommandBufferKHR = nullptr ;
24
+ cl_int Res =
25
+ cl_ext::getExtFuncFromContext<decltype (clCreateCommandBufferKHR)>(
26
+ CLContext, cl_ext::ExtFuncPtrCache->clCreateCommandBufferKHRCache ,
27
+ cl_ext::CreateCommandBufferName, &clCreateCommandBufferKHR);
28
+
29
+ if (!clCreateCommandBufferKHR || Res != CL_SUCCESS)
30
+ return UR_RESULT_ERROR_INVALID_OPERATION;
31
+
32
+ auto CLCommandBuffer = clCreateCommandBufferKHR (
33
+ 1 , cl_adapter::cast<cl_command_queue *>(&Queue), nullptr , &Res);
34
+ CL_RETURN_ON_FAILURE_AND_SET_NULL (Res, phCommandBuffer);
35
+
36
+ try {
37
+ auto URCommandBuffer = std::make_unique<ur_exp_command_buffer_handle_t_>(
38
+ Queue, hContext, CLCommandBuffer);
39
+ *phCommandBuffer = URCommandBuffer.release ();
40
+ } catch (...) {
41
+ return UR_RESULT_ERROR_OUT_OF_RESOURCES;
42
+ }
43
+
44
+ CL_RETURN_ON_FAILURE (Res);
45
+ return UR_RESULT_SUCCESS;
25
46
}
26
47
27
- UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferRetainExp (
28
- [[maybe_unused]] ur_exp_command_buffer_handle_t hCommandBuffer) {
48
+ UR_APIEXPORT ur_result_t UR_APICALL
49
+ urCommandBufferRetainExp (ur_exp_command_buffer_handle_t hCommandBuffer) {
50
+ UR_RETURN_ON_FAILURE (urQueueRetain (hCommandBuffer->hInternalQueue ));
29
51
30
- cl_adapter::die (" Experimental Command-buffer feature is not "
31
- " implemented for OpenCL adapter." );
32
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
52
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
53
+ cl_ext::clRetainCommandBufferKHR_fn clRetainCommandBuffer = nullptr ;
54
+ cl_int Res = cl_ext::getExtFuncFromContext<decltype (clRetainCommandBuffer)>(
55
+ CLContext, cl_ext::ExtFuncPtrCache->clRetainCommandBufferKHRCache ,
56
+ cl_ext::RetainCommandBufferName, &clRetainCommandBuffer);
57
+
58
+ if (!clRetainCommandBuffer || Res != CL_SUCCESS)
59
+ return UR_RESULT_ERROR_INVALID_OPERATION;
60
+
61
+ CL_RETURN_ON_FAILURE (clRetainCommandBuffer (hCommandBuffer->CLCommandBuffer ));
62
+ return UR_RESULT_SUCCESS;
33
63
}
34
64
35
- UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferReleaseExp (
36
- [[maybe_unused]] ur_exp_command_buffer_handle_t hCommandBuffer) {
65
+ UR_APIEXPORT ur_result_t UR_APICALL
66
+ urCommandBufferReleaseExp (ur_exp_command_buffer_handle_t hCommandBuffer) {
67
+ UR_RETURN_ON_FAILURE (urQueueRelease (hCommandBuffer->hInternalQueue ));
37
68
38
- cl_adapter::die (" Experimental Command-buffer feature is not "
39
- " implemented for OpenCL adapter." );
40
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
69
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
70
+ cl_ext::clReleaseCommandBufferKHR_fn clReleaseCommandBufferKHR = nullptr ;
71
+ cl_int Res =
72
+ cl_ext::getExtFuncFromContext<decltype (clReleaseCommandBufferKHR)>(
73
+ CLContext, cl_ext::ExtFuncPtrCache->clReleaseCommandBufferKHRCache ,
74
+ cl_ext::ReleaseCommandBufferName, &clReleaseCommandBufferKHR);
75
+
76
+ if (!clReleaseCommandBufferKHR || Res != CL_SUCCESS)
77
+ return UR_RESULT_ERROR_INVALID_OPERATION;
78
+
79
+ CL_RETURN_ON_FAILURE (
80
+ clReleaseCommandBufferKHR (hCommandBuffer->CLCommandBuffer ));
81
+ return UR_RESULT_SUCCESS;
41
82
}
42
83
43
- UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferFinalizeExp (
44
- [[maybe_unused]] ur_exp_command_buffer_handle_t hCommandBuffer) {
84
+ UR_APIEXPORT ur_result_t UR_APICALL
85
+ urCommandBufferFinalizeExp (ur_exp_command_buffer_handle_t hCommandBuffer) {
86
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
87
+ cl_ext::clFinalizeCommandBufferKHR_fn clFinalizeCommandBufferKHR = nullptr ;
88
+ cl_int Res =
89
+ cl_ext::getExtFuncFromContext<decltype (clFinalizeCommandBufferKHR)>(
90
+ CLContext, cl_ext::ExtFuncPtrCache->clFinalizeCommandBufferKHRCache ,
91
+ cl_ext::FinalizeCommandBufferName, &clFinalizeCommandBufferKHR);
45
92
46
- cl_adapter::die (" Experimental Command-buffer feature is not "
47
- " implemented for OpenCL adapter." );
48
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
93
+ if (!clFinalizeCommandBufferKHR || Res != CL_SUCCESS)
94
+ return UR_RESULT_ERROR_INVALID_OPERATION;
95
+
96
+ CL_RETURN_ON_FAILURE (
97
+ clFinalizeCommandBufferKHR (hCommandBuffer->CLCommandBuffer ));
98
+ return UR_RESULT_SUCCESS;
49
99
}
50
100
51
101
UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendKernelLaunchExp (
52
- [[maybe_unused]] ur_exp_command_buffer_handle_t hCommandBuffer,
53
- [[maybe_unused]] ur_kernel_handle_t hKernel,
54
- [[maybe_unused]] uint32_t workDim,
55
- [[maybe_unused]] const size_t *pGlobalWorkOffset,
56
- [[maybe_unused]] const size_t *pGlobalWorkSize,
57
- [[maybe_unused]] const size_t *pLocalWorkSize,
58
- [[maybe_unused]] uint32_t numSyncPointsInWaitList,
59
- [[maybe_unused]] const ur_exp_command_buffer_sync_point_t
60
- *pSyncPointWaitList,
61
- [[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
102
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_kernel_handle_t hKernel,
103
+ uint32_t workDim, const size_t *pGlobalWorkOffset,
104
+ const size_t *pGlobalWorkSize, const size_t *pLocalWorkSize,
105
+ uint32_t numSyncPointsInWaitList,
106
+ const ur_exp_command_buffer_sync_point_t *pSyncPointWaitList,
107
+ ur_exp_command_buffer_sync_point_t *pSyncPoint) {
62
108
63
- cl_adapter::die (" Experimental Command-buffer feature is not "
64
- " implemented for OpenCL adapter." );
65
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
109
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
110
+ cl_ext::clCommandNDRangeKernelKHR_fn clCommandNDRangeKernelKHR = nullptr ;
111
+ cl_int Res =
112
+ cl_ext::getExtFuncFromContext<decltype (clCommandNDRangeKernelKHR)>(
113
+ CLContext, cl_ext::ExtFuncPtrCache->clCommandNDRangeKernelKHRCache ,
114
+ cl_ext::CommandNRRangeKernelName, &clCommandNDRangeKernelKHR);
115
+
116
+ if (!clCommandNDRangeKernelKHR || Res != CL_SUCCESS)
117
+ return UR_RESULT_ERROR_INVALID_OPERATION;
118
+
119
+ CL_RETURN_ON_FAILURE (clCommandNDRangeKernelKHR (
120
+ hCommandBuffer->CLCommandBuffer , nullptr , nullptr ,
121
+ cl_adapter::cast<cl_kernel>(hKernel), workDim, pGlobalWorkOffset,
122
+ pGlobalWorkSize, pLocalWorkSize, numSyncPointsInWaitList,
123
+ pSyncPointWaitList, pSyncPoint, nullptr ));
124
+
125
+ return UR_RESULT_SUCCESS;
66
126
}
67
127
68
128
UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMemcpyUSMExp (
@@ -74,43 +134,82 @@ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMemcpyUSMExp(
74
134
*pSyncPointWaitList,
75
135
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
76
136
77
- cl_adapter::die (" Experimental Command-buffer feature is not "
137
+ cl_adapter::die (" Experimental Command-buffer entry point is not "
78
138
" implemented for OpenCL adapter." );
79
139
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
80
140
}
81
141
82
- UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMembufferCopyExp (
142
+ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendUSMFillExp (
83
143
[[maybe_unused]] ur_exp_command_buffer_handle_t hCommandBuffer,
84
- [[maybe_unused]] ur_mem_handle_t hSrcMem,
85
- [[maybe_unused]] ur_mem_handle_t hDstMem, [[maybe_unused]] size_t srcOffset,
86
- [[maybe_unused]] size_t dstOffset, [[maybe_unused]] size_t size,
144
+ [[maybe_unused]] void *pMemory, [[maybe_unused]] const void *pPattern,
145
+ [[maybe_unused]] size_t patternSize, [[maybe_unused]] size_t size,
87
146
[[maybe_unused]] uint32_t numSyncPointsInWaitList,
88
147
[[maybe_unused]] const ur_exp_command_buffer_sync_point_t
89
148
*pSyncPointWaitList,
90
149
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
91
-
92
- cl_adapter::die (" Experimental Command-buffer feature is not "
150
+ cl_adapter::die (" Experimental Command-buffer entry point is not "
93
151
" implemented for OpenCL adapter." );
94
152
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
95
153
}
96
154
155
+ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMembufferCopyExp (
156
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_mem_handle_t hSrcMem,
157
+ ur_mem_handle_t hDstMem, size_t srcOffset, size_t dstOffset, size_t size,
158
+ uint32_t numSyncPointsInWaitList,
159
+ const ur_exp_command_buffer_sync_point_t *pSyncPointWaitList,
160
+ ur_exp_command_buffer_sync_point_t *pSyncPoint) {
161
+
162
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
163
+ cl_ext::clCommandCopyBufferKHR_fn clCommandCopyBufferKHR = nullptr ;
164
+ cl_int Res = cl_ext::getExtFuncFromContext<decltype (clCommandCopyBufferKHR)>(
165
+ CLContext, cl_ext::ExtFuncPtrCache->clCommandCopyBufferKHRCache ,
166
+ cl_ext::CommandCopyBufferName, &clCommandCopyBufferKHR);
167
+
168
+ if (!clCommandCopyBufferKHR || Res != CL_SUCCESS)
169
+ return UR_RESULT_ERROR_INVALID_OPERATION;
170
+
171
+ CL_RETURN_ON_FAILURE (clCommandCopyBufferKHR (
172
+ hCommandBuffer->CLCommandBuffer ,
173
+ nullptr ,
174
+ cl_adapter::cast<cl_mem>(hSrcMem), cl_adapter::cast<cl_mem>(hDstMem),
175
+ srcOffset, dstOffset, size, numSyncPointsInWaitList, pSyncPointWaitList,
176
+ pSyncPoint, nullptr ));
177
+
178
+ return UR_RESULT_SUCCESS;
179
+ }
180
+
97
181
UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMembufferCopyRectExp (
98
- [[maybe_unused]] ur_exp_command_buffer_handle_t hCommandBuffer,
99
- [[maybe_unused]] ur_mem_handle_t hSrcMem,
100
- [[maybe_unused]] ur_mem_handle_t hDstMem,
101
- [[maybe_unused]] ur_rect_offset_t srcOrigin,
102
- [[maybe_unused]] ur_rect_offset_t dstOrigin,
103
- [[maybe_unused]] ur_rect_region_t region,
104
- [[maybe_unused]] size_t srcRowPitch, [[maybe_unused]] size_t srcSlicePitch,
105
- [[maybe_unused]] size_t dstRowPitch, [[maybe_unused]] size_t dstSlicePitch,
106
- [[maybe_unused]] uint32_t numSyncPointsInWaitList,
107
- [[maybe_unused]] const ur_exp_command_buffer_sync_point_t
108
- *pSyncPointWaitList,
109
- [[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
182
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_mem_handle_t hSrcMem,
183
+ ur_mem_handle_t hDstMem, ur_rect_offset_t srcOrigin,
184
+ ur_rect_offset_t dstOrigin, ur_rect_region_t region, size_t srcRowPitch,
185
+ size_t srcSlicePitch, size_t dstRowPitch, size_t dstSlicePitch,
186
+ uint32_t numSyncPointsInWaitList,
187
+ const ur_exp_command_buffer_sync_point_t *pSyncPointWaitList,
188
+ ur_exp_command_buffer_sync_point_t *pSyncPoint) {
110
189
111
- cl_adapter::die (" Experimental Command-buffer feature is not "
112
- " implemented for OpenCL adapter." );
113
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
190
+ size_t OpenCLOriginRect[3 ]{srcOrigin.x , srcOrigin.y , srcOrigin.z };
191
+ size_t OpenCLDstRect[3 ]{dstOrigin.x , dstOrigin.y , dstOrigin.z };
192
+ size_t OpenCLRegion[3 ]{region.width , region.height , region.depth };
193
+
194
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
195
+ cl_ext::clCommandCopyBufferRectKHR_fn clCommandCopyBufferRectKHR = nullptr ;
196
+ cl_int Res =
197
+ cl_ext::getExtFuncFromContext<decltype (clCommandCopyBufferRectKHR)>(
198
+ CLContext, cl_ext::ExtFuncPtrCache->clCommandCopyBufferRectKHRCache ,
199
+ cl_ext::CommandCopyBufferRectName, &clCommandCopyBufferRectKHR);
200
+
201
+ if (!clCommandCopyBufferRectKHR || Res != CL_SUCCESS)
202
+ return UR_RESULT_ERROR_INVALID_OPERATION;
203
+
204
+ CL_RETURN_ON_FAILURE (clCommandCopyBufferRectKHR (
205
+ hCommandBuffer->CLCommandBuffer ,
206
+ nullptr ,
207
+ cl_adapter::cast<cl_mem>(hSrcMem), cl_adapter::cast<cl_mem>(hDstMem),
208
+ OpenCLOriginRect, OpenCLDstRect, OpenCLRegion, srcRowPitch, srcSlicePitch,
209
+ dstRowPitch, dstSlicePitch, numSyncPointsInWaitList, pSyncPointWaitList,
210
+ pSyncPoint, nullptr ));
211
+
212
+ return UR_RESULT_SUCCESS;
114
213
}
115
214
116
215
UR_APIEXPORT
@@ -123,7 +222,7 @@ ur_result_t UR_APICALL urCommandBufferAppendMembufferWriteExp(
123
222
*pSyncPointWaitList,
124
223
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
125
224
126
- cl_adapter::die (" Experimental Command-buffer feature is not "
225
+ cl_adapter::die (" Experimental Command-buffer entry point is not "
127
226
" implemented for OpenCL adapter." );
128
227
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
129
228
}
@@ -138,7 +237,7 @@ ur_result_t UR_APICALL urCommandBufferAppendMembufferReadExp(
138
237
*pSyncPointWaitList,
139
238
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
140
239
141
- cl_adapter::die (" Experimental Command-buffer feature is not "
240
+ cl_adapter::die (" Experimental Command-buffer entry point is not "
142
241
" implemented for OpenCL adapter." );
143
242
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
144
243
}
@@ -159,7 +258,7 @@ ur_result_t UR_APICALL urCommandBufferAppendMembufferWriteRectExp(
159
258
*pSyncPointWaitList,
160
259
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
161
260
162
- cl_adapter::die (" Experimental Command-buffer feature is not "
261
+ cl_adapter::die (" Experimental Command-buffer entry point is not "
163
262
" implemented for OpenCL adapter." );
164
263
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
165
264
}
@@ -180,19 +279,58 @@ ur_result_t UR_APICALL urCommandBufferAppendMembufferReadRectExp(
180
279
*pSyncPointWaitList,
181
280
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
182
281
183
- cl_adapter::die (" Experimental Command-buffer feature is not "
282
+ cl_adapter::die (" Experimental Command-buffer entry point is not "
184
283
" implemented for OpenCL adapter." );
185
284
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
186
285
}
187
286
287
+ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMembufferFillExp (
288
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_mem_handle_t hBuffer,
289
+ const void *pPattern, size_t patternSize, size_t offset, size_t size,
290
+ uint32_t numSyncPointsInWaitList,
291
+ const ur_exp_command_buffer_sync_point_t *pSyncPointWaitList,
292
+ ur_exp_command_buffer_sync_point_t *pSyncPoint) {
293
+
294
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
295
+ cl_ext::clCommandFillBufferKHR_fn clCommandFillBufferKHR = nullptr ;
296
+ cl_int Res = cl_ext::getExtFuncFromContext<decltype (clCommandFillBufferKHR)>(
297
+ CLContext, cl_ext::ExtFuncPtrCache->clCommandFillBufferKHRCache ,
298
+ cl_ext::CommandFillBufferName, &clCommandFillBufferKHR);
299
+
300
+ if (!clCommandFillBufferKHR || Res != CL_SUCCESS)
301
+ return UR_RESULT_ERROR_INVALID_OPERATION;
302
+
303
+ CL_RETURN_ON_FAILURE (clCommandFillBufferKHR (
304
+ hCommandBuffer->CLCommandBuffer ,
305
+ nullptr ,
306
+ cl_adapter::cast<cl_mem>(hBuffer), pPattern, patternSize, offset, size,
307
+ numSyncPointsInWaitList, pSyncPointWaitList, pSyncPoint, nullptr ));
308
+
309
+ return UR_RESULT_SUCCESS;
310
+ }
311
+
188
312
UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferEnqueueExp (
189
- [[maybe_unused]] ur_exp_command_buffer_handle_t hCommandBuffer,
190
- [[maybe_unused]] ur_queue_handle_t hQueue,
191
- [[maybe_unused]] uint32_t numEventsInWaitList,
192
- [[maybe_unused]] const ur_event_handle_t *phEventWaitList,
193
- [[maybe_unused]] ur_event_handle_t *phEvent) {
313
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_queue_handle_t hQueue,
314
+ uint32_t numEventsInWaitList, const ur_event_handle_t *phEventWaitList,
315
+ ur_event_handle_t *phEvent) {
194
316
195
- cl_adapter::die (" Experimental Command-buffer feature is not "
196
- " implemented for OpenCL adapter." );
197
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
317
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
318
+ cl_ext::clEnqueueCommandBufferKHR_fn clEnqueueCommandBufferKHR = nullptr ;
319
+ cl_int Res =
320
+ cl_ext::getExtFuncFromContext<decltype (clEnqueueCommandBufferKHR)>(
321
+ CLContext, cl_ext::ExtFuncPtrCache->clEnqueueCommandBufferKHRCache ,
322
+ cl_ext::EnqueueCommandBufferName, &clEnqueueCommandBufferKHR);
323
+
324
+ if (!clEnqueueCommandBufferKHR || Res != CL_SUCCESS)
325
+ return UR_RESULT_ERROR_INVALID_OPERATION;
326
+
327
+ const uint32_t NumberOfQueues = 1 ;
328
+
329
+ CL_RETURN_ON_FAILURE (clEnqueueCommandBufferKHR (
330
+ NumberOfQueues, cl_adapter::cast<cl_command_queue *>(&hQueue),
331
+ hCommandBuffer->CLCommandBuffer , numEventsInWaitList,
332
+ cl_adapter::cast<const cl_event *>(phEventWaitList),
333
+ cl_adapter::cast<cl_event *>(phEvent)));
334
+
335
+ return UR_RESULT_SUCCESS;
198
336
}
0 commit comments