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 (
@@ -73,44 +133,76 @@ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMemcpyUSMExp(
73
133
[[maybe_unused]] const ur_exp_command_buffer_sync_point_t
74
134
*pSyncPointWaitList,
75
135
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
76
-
77
- cl_adapter::die (" Experimental Command-buffer feature is not "
78
- " implemented for OpenCL adapter." );
79
136
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
80
137
}
81
138
82
- UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMembufferCopyExp (
139
+ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendUSMFillExp (
83
140
[[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,
141
+ [[maybe_unused]] void *pMemory, [[maybe_unused]] const void *pPattern,
142
+ [[maybe_unused]] size_t patternSize, [[maybe_unused]] size_t size,
87
143
[[maybe_unused]] uint32_t numSyncPointsInWaitList,
88
144
[[maybe_unused]] const ur_exp_command_buffer_sync_point_t
89
145
*pSyncPointWaitList,
90
146
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
91
-
92
- cl_adapter::die (" Experimental Command-buffer feature is not "
93
- " implemented for OpenCL adapter." );
94
147
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
95
148
}
96
149
150
+ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMembufferCopyExp (
151
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_mem_handle_t hSrcMem,
152
+ ur_mem_handle_t hDstMem, size_t srcOffset, size_t dstOffset, size_t size,
153
+ uint32_t numSyncPointsInWaitList,
154
+ const ur_exp_command_buffer_sync_point_t *pSyncPointWaitList,
155
+ ur_exp_command_buffer_sync_point_t *pSyncPoint) {
156
+
157
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
158
+ cl_ext::clCommandCopyBufferKHR_fn clCommandCopyBufferKHR = nullptr ;
159
+ cl_int Res = cl_ext::getExtFuncFromContext<decltype (clCommandCopyBufferKHR)>(
160
+ CLContext, cl_ext::ExtFuncPtrCache->clCommandCopyBufferKHRCache ,
161
+ cl_ext::CommandCopyBufferName, &clCommandCopyBufferKHR);
162
+
163
+ if (!clCommandCopyBufferKHR || Res != CL_SUCCESS)
164
+ return UR_RESULT_ERROR_INVALID_OPERATION;
165
+
166
+ CL_RETURN_ON_FAILURE (clCommandCopyBufferKHR (
167
+ hCommandBuffer->CLCommandBuffer , nullptr ,
168
+ cl_adapter::cast<cl_mem>(hSrcMem), cl_adapter::cast<cl_mem>(hDstMem),
169
+ srcOffset, dstOffset, size, numSyncPointsInWaitList, pSyncPointWaitList,
170
+ pSyncPoint, nullptr ));
171
+
172
+ return UR_RESULT_SUCCESS;
173
+ }
174
+
97
175
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) {
176
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_mem_handle_t hSrcMem,
177
+ ur_mem_handle_t hDstMem, ur_rect_offset_t srcOrigin,
178
+ ur_rect_offset_t dstOrigin, ur_rect_region_t region, size_t srcRowPitch,
179
+ size_t srcSlicePitch, size_t dstRowPitch, size_t dstSlicePitch,
180
+ uint32_t numSyncPointsInWaitList,
181
+ const ur_exp_command_buffer_sync_point_t *pSyncPointWaitList,
182
+ ur_exp_command_buffer_sync_point_t *pSyncPoint) {
110
183
111
- cl_adapter::die (" Experimental Command-buffer feature is not "
112
- " implemented for OpenCL adapter." );
113
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
184
+ size_t OpenCLOriginRect[3 ]{srcOrigin.x , srcOrigin.y , srcOrigin.z };
185
+ size_t OpenCLDstRect[3 ]{dstOrigin.x , dstOrigin.y , dstOrigin.z };
186
+ size_t OpenCLRegion[3 ]{region.width , region.height , region.depth };
187
+
188
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
189
+ cl_ext::clCommandCopyBufferRectKHR_fn clCommandCopyBufferRectKHR = nullptr ;
190
+ cl_int Res =
191
+ cl_ext::getExtFuncFromContext<decltype (clCommandCopyBufferRectKHR)>(
192
+ CLContext, cl_ext::ExtFuncPtrCache->clCommandCopyBufferRectKHRCache ,
193
+ cl_ext::CommandCopyBufferRectName, &clCommandCopyBufferRectKHR);
194
+
195
+ if (!clCommandCopyBufferRectKHR || Res != CL_SUCCESS)
196
+ return UR_RESULT_ERROR_INVALID_OPERATION;
197
+
198
+ CL_RETURN_ON_FAILURE (clCommandCopyBufferRectKHR (
199
+ hCommandBuffer->CLCommandBuffer , nullptr ,
200
+ cl_adapter::cast<cl_mem>(hSrcMem), cl_adapter::cast<cl_mem>(hDstMem),
201
+ OpenCLOriginRect, OpenCLDstRect, OpenCLRegion, srcRowPitch, srcSlicePitch,
202
+ dstRowPitch, dstSlicePitch, numSyncPointsInWaitList, pSyncPointWaitList,
203
+ pSyncPoint, nullptr ));
204
+
205
+ return UR_RESULT_SUCCESS;
114
206
}
115
207
116
208
UR_APIEXPORT
@@ -122,9 +214,6 @@ ur_result_t UR_APICALL urCommandBufferAppendMembufferWriteExp(
122
214
[[maybe_unused]] const ur_exp_command_buffer_sync_point_t
123
215
*pSyncPointWaitList,
124
216
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
125
-
126
- cl_adapter::die (" Experimental Command-buffer feature is not "
127
- " implemented for OpenCL adapter." );
128
217
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
129
218
}
130
219
@@ -137,9 +226,6 @@ ur_result_t UR_APICALL urCommandBufferAppendMembufferReadExp(
137
226
[[maybe_unused]] const ur_exp_command_buffer_sync_point_t
138
227
*pSyncPointWaitList,
139
228
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
140
-
141
- cl_adapter::die (" Experimental Command-buffer feature is not "
142
- " implemented for OpenCL adapter." );
143
229
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
144
230
}
145
231
@@ -158,9 +244,6 @@ ur_result_t UR_APICALL urCommandBufferAppendMembufferWriteRectExp(
158
244
[[maybe_unused]] const ur_exp_command_buffer_sync_point_t
159
245
*pSyncPointWaitList,
160
246
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
161
-
162
- cl_adapter::die (" Experimental Command-buffer feature is not "
163
- " implemented for OpenCL adapter." );
164
247
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
165
248
}
166
249
@@ -179,20 +262,55 @@ ur_result_t UR_APICALL urCommandBufferAppendMembufferReadRectExp(
179
262
[[maybe_unused]] const ur_exp_command_buffer_sync_point_t
180
263
*pSyncPointWaitList,
181
264
[[maybe_unused]] ur_exp_command_buffer_sync_point_t *pSyncPoint) {
182
-
183
- cl_adapter::die (" Experimental Command-buffer feature is not "
184
- " implemented for OpenCL adapter." );
185
265
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
186
266
}
187
267
268
+ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendMembufferFillExp (
269
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_mem_handle_t hBuffer,
270
+ const void *pPattern, size_t patternSize, size_t offset, size_t size,
271
+ uint32_t numSyncPointsInWaitList,
272
+ const ur_exp_command_buffer_sync_point_t *pSyncPointWaitList,
273
+ ur_exp_command_buffer_sync_point_t *pSyncPoint) {
274
+
275
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
276
+ cl_ext::clCommandFillBufferKHR_fn clCommandFillBufferKHR = nullptr ;
277
+ cl_int Res = cl_ext::getExtFuncFromContext<decltype (clCommandFillBufferKHR)>(
278
+ CLContext, cl_ext::ExtFuncPtrCache->clCommandFillBufferKHRCache ,
279
+ cl_ext::CommandFillBufferName, &clCommandFillBufferKHR);
280
+
281
+ if (!clCommandFillBufferKHR || Res != CL_SUCCESS)
282
+ return UR_RESULT_ERROR_INVALID_OPERATION;
283
+
284
+ CL_RETURN_ON_FAILURE (clCommandFillBufferKHR (
285
+ hCommandBuffer->CLCommandBuffer , nullptr ,
286
+ cl_adapter::cast<cl_mem>(hBuffer), pPattern, patternSize, offset, size,
287
+ numSyncPointsInWaitList, pSyncPointWaitList, pSyncPoint, nullptr ));
288
+
289
+ return UR_RESULT_SUCCESS;
290
+ }
291
+
188
292
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) {
293
+ ur_exp_command_buffer_handle_t hCommandBuffer, ur_queue_handle_t hQueue,
294
+ uint32_t numEventsInWaitList, const ur_event_handle_t *phEventWaitList,
295
+ ur_event_handle_t *phEvent) {
194
296
195
- cl_adapter::die (" Experimental Command-buffer feature is not "
196
- " implemented for OpenCL adapter." );
197
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
297
+ cl_context CLContext = cl_adapter::cast<cl_context>(hCommandBuffer->hContext );
298
+ cl_ext::clEnqueueCommandBufferKHR_fn clEnqueueCommandBufferKHR = nullptr ;
299
+ cl_int Res =
300
+ cl_ext::getExtFuncFromContext<decltype (clEnqueueCommandBufferKHR)>(
301
+ CLContext, cl_ext::ExtFuncPtrCache->clEnqueueCommandBufferKHRCache ,
302
+ cl_ext::EnqueueCommandBufferName, &clEnqueueCommandBufferKHR);
303
+
304
+ if (!clEnqueueCommandBufferKHR || Res != CL_SUCCESS)
305
+ return UR_RESULT_ERROR_INVALID_OPERATION;
306
+
307
+ const uint32_t NumberOfQueues = 1 ;
308
+
309
+ CL_RETURN_ON_FAILURE (clEnqueueCommandBufferKHR (
310
+ NumberOfQueues, cl_adapter::cast<cl_command_queue *>(&hQueue),
311
+ hCommandBuffer->CLCommandBuffer , numEventsInWaitList,
312
+ cl_adapter::cast<const cl_event *>(phEventWaitList),
313
+ cl_adapter::cast<cl_event *>(phEvent)));
314
+
315
+ return UR_RESULT_SUCCESS;
198
316
}
0 commit comments