DPC++ Runtime
Runtime libraries for oneAPI DPC++
pi2ur.hpp
Go to the documentation of this file.
1 //===---------------- pi2ur.hpp - PI API to UR API ------------------------==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 #pragma once
9 
10 #include "ur_api.h"
11 #include <cstdarg>
13 #include <sycl/detail/pi.h>
14 #include <ur/ur.hpp>
15 
16 // Map of UR error codes to PI error codes
17 static pi_result ur2piResult(ur_result_t urResult) {
18  if (urResult == UR_RESULT_SUCCESS)
19  return PI_SUCCESS;
20 
21  switch (urResult) {
22  case UR_RESULT_ERROR_INVALID_OPERATION:
23  return PI_ERROR_INVALID_OPERATION;
24  case UR_RESULT_ERROR_INVALID_QUEUE_PROPERTIES:
25  return PI_ERROR_INVALID_QUEUE_PROPERTIES;
26  case UR_RESULT_ERROR_INVALID_QUEUE:
27  return PI_ERROR_INVALID_QUEUE;
28  case UR_RESULT_ERROR_INVALID_VALUE:
29  return PI_ERROR_INVALID_VALUE;
30  case UR_RESULT_ERROR_INVALID_CONTEXT:
31  return PI_ERROR_INVALID_CONTEXT;
32  case UR_RESULT_ERROR_INVALID_PLATFORM:
33  return PI_ERROR_INVALID_PLATFORM;
34  case UR_RESULT_ERROR_INVALID_BINARY:
35  return PI_ERROR_INVALID_BINARY;
36  case UR_RESULT_ERROR_INVALID_PROGRAM:
37  return PI_ERROR_INVALID_PROGRAM;
38  case UR_RESULT_ERROR_INVALID_SAMPLER:
39  return PI_ERROR_INVALID_SAMPLER;
40  case UR_RESULT_ERROR_INVALID_MEM_OBJECT:
41  return PI_ERROR_INVALID_MEM_OBJECT;
42  case UR_RESULT_ERROR_INVALID_EVENT:
43  return PI_ERROR_INVALID_EVENT;
44  case UR_RESULT_ERROR_INVALID_EVENT_WAIT_LIST:
45  return PI_ERROR_INVALID_EVENT_WAIT_LIST;
46  case UR_RESULT_ERROR_MISALIGNED_SUB_BUFFER_OFFSET:
47  return PI_ERROR_MISALIGNED_SUB_BUFFER_OFFSET;
48  case UR_RESULT_ERROR_INVALID_WORK_GROUP_SIZE:
49  return PI_ERROR_INVALID_WORK_GROUP_SIZE;
50  case UR_RESULT_ERROR_COMPILER_NOT_AVAILABLE:
51  return PI_ERROR_COMPILER_NOT_AVAILABLE;
52  case UR_RESULT_ERROR_PROFILING_INFO_NOT_AVAILABLE:
53  return PI_ERROR_PROFILING_INFO_NOT_AVAILABLE;
54  case UR_RESULT_ERROR_DEVICE_NOT_FOUND:
55  return PI_ERROR_DEVICE_NOT_FOUND;
56  case UR_RESULT_ERROR_INVALID_DEVICE:
57  return PI_ERROR_INVALID_DEVICE;
58  case UR_RESULT_ERROR_DEVICE_REQUIRES_RESET:
59  case UR_RESULT_ERROR_DEVICE_LOST:
60  case UR_RESULT_ERROR_DEVICE_NOT_AVAILABLE:
61  return PI_ERROR_DEVICE_NOT_AVAILABLE;
62  case UR_RESULT_ERROR_DEVICE_PARTITION_FAILED:
63  return PI_ERROR_DEVICE_PARTITION_FAILED;
64  case UR_RESULT_ERROR_INVALID_DEVICE_PARTITION_COUNT:
65  return PI_ERROR_INVALID_DEVICE_PARTITION_COUNT;
66  case UR_RESULT_ERROR_INVALID_WORK_ITEM_SIZE:
67  return PI_ERROR_INVALID_WORK_ITEM_SIZE;
68  case UR_RESULT_ERROR_INVALID_WORK_DIMENSION:
69  return PI_ERROR_INVALID_WORK_DIMENSION;
70  case UR_RESULT_ERROR_INVALID_KERNEL_ARGS:
71  return PI_ERROR_INVALID_KERNEL_ARGS;
72  case UR_RESULT_ERROR_INVALID_KERNEL:
73  return PI_ERROR_INVALID_KERNEL;
74  case UR_RESULT_ERROR_INVALID_KERNEL_NAME:
75  return PI_ERROR_INVALID_KERNEL_NAME;
76  case UR_RESULT_ERROR_INVALID_KERNEL_ARGUMENT_INDEX:
77  return PI_ERROR_INVALID_ARG_INDEX;
78  case UR_RESULT_ERROR_INVALID_KERNEL_ARGUMENT_SIZE:
79  return PI_ERROR_INVALID_ARG_SIZE;
80  case UR_RESULT_ERROR_INVALID_KERNEL_ATTRIBUTE_VALUE:
81  return PI_ERROR_INVALID_VALUE;
82  case UR_RESULT_ERROR_INVALID_IMAGE_SIZE:
83  return PI_ERROR_INVALID_IMAGE_SIZE;
84  case UR_RESULT_ERROR_INVALID_IMAGE_FORMAT_DESCRIPTOR:
85  return PI_ERROR_INVALID_IMAGE_FORMAT_DESCRIPTOR;
86  case UR_RESULT_ERROR_IMAGE_FORMAT_NOT_SUPPORTED:
87  return PI_ERROR_IMAGE_FORMAT_NOT_SUPPORTED;
88  case UR_RESULT_ERROR_MEM_OBJECT_ALLOCATION_FAILURE:
89  return PI_ERROR_MEM_OBJECT_ALLOCATION_FAILURE;
90  case UR_RESULT_ERROR_INVALID_PROGRAM_EXECUTABLE:
91  return PI_ERROR_INVALID_PROGRAM_EXECUTABLE;
92  case UR_RESULT_ERROR_UNINITIALIZED:
93  return PI_ERROR_UNINITIALIZED;
94  case UR_RESULT_ERROR_OUT_OF_HOST_MEMORY:
95  return PI_ERROR_OUT_OF_HOST_MEMORY;
96  case UR_RESULT_ERROR_OUT_OF_DEVICE_MEMORY:
97  case UR_RESULT_ERROR_OUT_OF_RESOURCES:
98  return PI_ERROR_OUT_OF_RESOURCES;
99  case UR_RESULT_ERROR_PROGRAM_BUILD_FAILURE:
100  return PI_ERROR_BUILD_PROGRAM_FAILURE;
101  case UR_RESULT_ERROR_PROGRAM_LINK_FAILURE:
102  return PI_ERROR_LINK_PROGRAM_FAILURE;
103  case UR_RESULT_ERROR_UNSUPPORTED_VERSION:
104  return PI_ERROR_INVALID_OPERATION;
105  case UR_RESULT_ERROR_UNSUPPORTED_FEATURE:
106  return PI_ERROR_UNSUPPORTED_FEATURE;
107  case UR_RESULT_ERROR_INVALID_ARGUMENT:
108  case UR_RESULT_ERROR_INVALID_NULL_HANDLE:
109  case UR_RESULT_ERROR_HANDLE_OBJECT_IN_USE:
110  case UR_RESULT_ERROR_INVALID_NULL_POINTER:
111  return PI_ERROR_INVALID_VALUE;
112  case UR_RESULT_ERROR_INVALID_SIZE:
113  case UR_RESULT_ERROR_UNSUPPORTED_SIZE:
114  return PI_ERROR_INVALID_BUFFER_SIZE;
115  case UR_RESULT_ERROR_UNSUPPORTED_ALIGNMENT:
116  return PI_ERROR_INVALID_VALUE;
117  case UR_RESULT_ERROR_INVALID_SYNCHRONIZATION_OBJECT:
118  case UR_RESULT_ERROR_INVALID_ENUMERATION:
119  case UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION:
120  return PI_ERROR_INVALID_VALUE;
121  case UR_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT:
122  return PI_ERROR_IMAGE_FORMAT_NOT_SUPPORTED;
123  case UR_RESULT_ERROR_INVALID_NATIVE_BINARY:
124  return PI_ERROR_INVALID_BINARY;
125  case UR_RESULT_ERROR_INVALID_GLOBAL_NAME:
126  return PI_ERROR_INVALID_VALUE;
127  case UR_RESULT_ERROR_INVALID_FUNCTION_NAME:
128  return PI_ERROR_FUNCTION_ADDRESS_IS_NOT_AVAILABLE;
129  case UR_RESULT_ERROR_INVALID_GROUP_SIZE_DIMENSION:
130  return PI_ERROR_INVALID_WORK_DIMENSION;
131  case UR_RESULT_ERROR_INVALID_GLOBAL_WIDTH_DIMENSION:
132  return PI_ERROR_INVALID_VALUE;
133  case UR_RESULT_ERROR_PROGRAM_UNLINKED:
134  return PI_ERROR_INVALID_PROGRAM_EXECUTABLE;
135  case UR_RESULT_ERROR_OVERLAPPING_REGIONS:
136  return PI_ERROR_MEM_COPY_OVERLAP;
137  case UR_RESULT_ERROR_INVALID_HOST_PTR:
138  return PI_ERROR_INVALID_HOST_PTR;
139  case UR_RESULT_ERROR_INVALID_USM_SIZE:
140  return PI_ERROR_INVALID_BUFFER_SIZE;
141  case UR_RESULT_ERROR_OBJECT_ALLOCATION_FAILURE:
142  return PI_ERROR_OUT_OF_RESOURCES;
143  case UR_RESULT_ERROR_ADAPTER_SPECIFIC:
144  return PI_ERROR_PLUGIN_SPECIFIC_ERROR;
145  case UR_RESULT_ERROR_INVALID_COMMAND_BUFFER_EXP:
146  return PI_ERROR_INVALID_COMMAND_BUFFER_KHR;
147  case UR_RESULT_ERROR_INVALID_COMMAND_BUFFER_SYNC_POINT_WAIT_LIST_EXP:
148  return PI_ERROR_INVALID_SYNC_POINT_WAIT_LIST_KHR;
149  case UR_RESULT_ERROR_IN_EVENT_LIST_EXEC_STATUS:
150  return PI_ERROR_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST;
151  case UR_RESULT_ERROR_UNKNOWN:
152  default:
153  return PI_ERROR_UNKNOWN;
154  };
155 }
156 
157 // Helper for one-liner validation
158 #define PI_ASSERT(condition, error) \
159  if (!(condition)) \
160  return error;
161 
162 // Early exits on any error
163 #define HANDLE_ERRORS(urCall) \
164  if (auto Result = urCall) \
165  return ur2piResult(Result);
166 
167 // A version of return helper that returns pi_result and not ur_result_t
168 class ReturnHelper : public UrReturnHelper {
169 public:
170  using UrReturnHelper::UrReturnHelper;
171 
172  template <class T> pi_result operator()(const T &t) {
173  return ur2piResult(UrReturnHelper::operator()(t));
174  }
175  // Array return value
176  template <class T> pi_result operator()(const T *t, size_t s) {
177  return ur2piResult(UrReturnHelper::operator()(t, s));
178  }
179  // Array return value where element type is different from T
180  template <class RetType, class T> pi_result operator()(const T *t, size_t s) {
181  return ur2piResult(UrReturnHelper::operator()<RetType>(t, s));
182  }
183 };
184 
185 // A version of return helper that supports conversion through a map
186 class ConvertHelper : public ReturnHelper {
187  using ReturnHelper::ReturnHelper;
188 
189 public:
190  // Convert the value using a conversion map
191  template <typename TypeUR, typename TypePI>
192  pi_result convert(std::function<TypePI(TypeUR)> Func) {
193  *param_value_size_ret = sizeof(TypePI);
194 
195  // There is no value to convert.
196  if (!param_value)
197  return PI_SUCCESS;
198 
199  auto pValueUR = static_cast<TypeUR *>(param_value);
200  auto pValuePI = static_cast<TypePI *>(param_value);
201 
202  // Cannot convert to a smaller storage type
203  PI_ASSERT(sizeof(TypePI) >= sizeof(TypeUR), PI_ERROR_UNKNOWN);
204 
205  *pValuePI = Func(*pValueUR);
206  return PI_SUCCESS;
207  }
208 
209  // Convert the array using a conversion map
210  template <typename TypeUR, typename TypePI>
211  pi_result convertArray(std::function<TypePI(TypeUR)> Func) {
212  // Cannot convert to a smaller element storage type
213  PI_ASSERT(sizeof(TypePI) >= sizeof(TypeUR), PI_ERROR_UNKNOWN);
214 
215  const uint32_t NumberElements =
216  *param_value_size_ret / sizeof(ur_device_partition_t);
217 
218  *param_value_size_ret *= sizeof(TypePI) / sizeof(TypeUR);
219 
220  // There is no value to convert. Adjust to a possibly bigger PI storage.
221  if (!param_value)
222  return PI_SUCCESS;
223 
224  PI_ASSERT(*param_value_size_ret % sizeof(TypePI) == 0, PI_ERROR_UNKNOWN);
225 
226  // Make a copy of the input UR array as we may possibly overwrite
227  // following elements while converting previous ones (if extending).
228  auto ValueUR = new char[*param_value_size_ret];
229  auto pValueUR = reinterpret_cast<TypeUR *>(ValueUR);
230  auto pValuePI = static_cast<TypePI *>(param_value);
231  memcpy(pValueUR, param_value, *param_value_size_ret);
232 
233  for (uint32_t I = 0; I < NumberElements; ++I) {
234  *pValuePI = Func(*pValueUR);
235  ++pValuePI;
236  ++pValueUR;
237  }
238 
239  delete[] ValueUR;
240  return PI_SUCCESS;
241  }
242 
243  // Convert the bitset using a conversion map
244  template <typename TypeUR, typename TypePI>
245  pi_result convertBitSet(std::function<TypePI(TypeUR)> Func) {
246  // There is no value to convert.
247  if (!param_value)
248  return PI_SUCCESS;
249 
250  auto pValuePI = static_cast<TypePI *>(param_value);
251  auto pValueUR = static_cast<TypeUR *>(param_value);
252 
253  // Cannot handle biteset large than size_t
254  PI_ASSERT(sizeof(TypeUR) <= sizeof(size_t), PI_ERROR_UNKNOWN);
255  size_t In = *pValueUR;
256  TypePI Out = 0;
257 
258  size_t Val;
259  while ((Val = In & -In)) { // Val is the rightmost set bit in In
260  In &= In - 1; // Reset the rightmost set bit
261 
262  // Convert the Val alone and merge it into Out
263  *pValueUR = TypeUR(Val);
264  if (auto Res = convert(Func))
265  return Res;
266  Out |= *pValuePI;
267  }
268  *pValuePI = TypePI(Out);
269  return PI_SUCCESS;
270  }
271 };
272 
273 // Handle mismatched PI and UR type return sizes for info queries
274 inline void fixupInfoValueTypes(size_t ParamValueSizeRetUR,
275  size_t *ParamValueSizeRetPI,
276  size_t ParamValueSize, void *ParamValue) {
277  if (ParamValueSizeRetUR == 1 && ParamValueSize == 4) {
278  // extend bool to pi_bool (uint32_t)
279  if (ParamValue) {
280  auto *ValIn = static_cast<bool *>(ParamValue);
281  auto *ValOut = static_cast<pi_bool *>(ParamValue);
282  *ValOut = static_cast<pi_bool>(*ValIn);
283  }
284  if (ParamValueSizeRetPI) {
285  *ParamValueSizeRetPI = sizeof(pi_bool);
286  }
287  }
288 }
289 
290 // Translate UR platform info values to PI info values
291 inline pi_result ur2piPlatformInfoValue(ur_platform_info_t ParamName,
292  size_t ParamValueSizePI,
293  size_t *ParamValueSizeUR,
294  void *ParamValue) {
295 
296  ConvertHelper Value(ParamValueSizePI, ParamValue, ParamValueSizeUR);
297 
298  switch (ParamName) {
299  case UR_PLATFORM_INFO_EXTENSIONS:
300  case UR_PLATFORM_INFO_NAME:
301  case UR_PLATFORM_INFO_PROFILE:
302  case UR_PLATFORM_INFO_VENDOR_NAME:
303  case UR_PLATFORM_INFO_VERSION:
304  // These ones do not need ur2pi translations
305  break;
306  case UR_PLATFORM_INFO_BACKEND: {
307  auto ConvertFunc = [](ur_platform_backend_t UrValue) {
308  switch (UrValue) {
309  case UR_PLATFORM_BACKEND_UNKNOWN:
311  case UR_PLATFORM_BACKEND_LEVEL_ZERO:
313  case UR_PLATFORM_BACKEND_OPENCL:
315  case UR_PLATFORM_BACKEND_CUDA:
317  case UR_PLATFORM_BACKEND_HIP:
319  case UR_PLATFORM_BACKEND_NATIVE_CPU:
321  default:
322  die("UR_PLATFORM_INFO_BACKEND: unhandled value");
323  }
324  };
325  return Value.convert<ur_platform_backend_t, pi_platform_backend>(
326  ConvertFunc);
327  }
328  default:
329  return PI_ERROR_UNKNOWN;
330  }
331 
332  if (ParamValueSizePI && ParamValueSizePI != *ParamValueSizeUR) {
333  fprintf(stderr, "UR PlatformInfoType=%d PI=%d but UR=%d\n", ParamName,
334  (int)ParamValueSizePI, (int)*ParamValueSizeUR);
335  die("ur2piPlatformInfoValue: size mismatch");
336  }
337  return PI_SUCCESS;
338 }
339 
349 inline pi_result ur2piDeviceInfoValue(ur_device_info_t ParamName,
350  size_t ParamValueSize, void *ParamValue,
351  size_t *ParamValueSizeRet) {
352 
353  /* Helper function to perform conversions in-place */
354  ConvertHelper Value(ParamValueSize, ParamValue, ParamValueSizeRet);
355 
356  pi_result Error = PI_SUCCESS;
357  if (ParamName == UR_DEVICE_INFO_TYPE) {
358  auto ConvertFunc = [](ur_device_type_t UrValue) {
359  switch (UrValue) {
360  case UR_DEVICE_TYPE_CPU:
361  return PI_DEVICE_TYPE_CPU;
362  case UR_DEVICE_TYPE_GPU:
363  return PI_DEVICE_TYPE_GPU;
364  case UR_DEVICE_TYPE_FPGA:
365  return PI_DEVICE_TYPE_ACC;
366  default:
367  die("UR_DEVICE_INFO_TYPE: unhandled value");
368  }
369  };
370  return Value.convert<ur_device_type_t, pi_device_type>(ConvertFunc);
371  } else if (ParamName == UR_DEVICE_INFO_QUEUE_PROPERTIES) {
372  auto ConvertFunc = [](ur_queue_flag_t UrValue) {
373  switch (UrValue) {
374  case UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE:
376  case UR_QUEUE_FLAG_PROFILING_ENABLE:
378  case UR_QUEUE_FLAG_ON_DEVICE:
380  case UR_QUEUE_FLAG_ON_DEVICE_DEFAULT:
382  case UR_QUEUE_FLAG_SYNC_WITH_DEFAULT_STREAM:
383  return static_cast<uint64_t>(__SYCL_PI_CUDA_SYNC_WITH_DEFAULT);
384  case UR_QUEUE_FLAG_USE_DEFAULT_STREAM:
385  return static_cast<uint64_t>(__SYCL_PI_CUDA_USE_DEFAULT_STREAM);
386  default:
387  die("UR_DEVICE_INFO_QUEUE_PROPERTIES: unhandled value");
388  }
389  };
390  return Value.convertBitSet<ur_queue_flag_t, pi_queue_properties>(
391  ConvertFunc);
392  } else if (ParamName == UR_DEVICE_INFO_EXECUTION_CAPABILITIES) {
393  auto ConvertFunc = [](ur_device_exec_capability_flag_t UrValue) {
394  switch (UrValue) {
395  case UR_DEVICE_EXEC_CAPABILITY_FLAG_KERNEL:
397  case UR_DEVICE_EXEC_CAPABILITY_FLAG_NATIVE_KERNEL:
399  default:
400  die("UR_DEVICE_INFO_EXECUTION_CAPABILITIES: unhandled value");
401  }
402  };
403  return Value
404  .convertBitSet<ur_device_exec_capability_flag_t, pi_queue_properties>(
405  ConvertFunc);
406  } else if (ParamName == UR_DEVICE_INFO_PARTITION_AFFINITY_DOMAIN) {
407  auto ConvertFunc = [](ur_device_affinity_domain_flag_t UrValue) {
408  switch (UrValue) {
409  case UR_DEVICE_AFFINITY_DOMAIN_FLAG_NUMA:
411  case UR_DEVICE_AFFINITY_DOMAIN_FLAG_NEXT_PARTITIONABLE:
413  default:
414  die("UR_DEVICE_INFO_PARTITION_AFFINITY_DOMAIN: unhandled value");
415  }
416  };
417  return Value.convertBitSet<ur_device_affinity_domain_flag_t,
418  pi_device_affinity_domain>(ConvertFunc);
419  } else if (ParamName == UR_DEVICE_INFO_PARTITION_TYPE) {
420 
421  auto ConvertFunc = [](ur_device_partition_t UrValue) {
422  switch (static_cast<uint32_t>(UrValue)) {
423  case UR_DEVICE_PARTITION_EQUALLY:
425  case UR_DEVICE_PARTITION_BY_COUNTS:
427  case UR_DEVICE_PARTITION_BY_AFFINITY_DOMAIN:
429  case UR_DEVICE_PARTITION_BY_CSLICE:
431  default:
432  die("UR_DEVICE_INFO_PARTITION_TYPE: unhandled value");
433  }
434  };
435 
436  /*
437  * This property returns the argument specified in piCreateSubDevices.
438  * Each partition name is immediately followed by a value. The list is
439  * terminated with 0. In the case where the properties argument to
440  * piCreateSubDevices is [PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN,
441  * PI_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE], the affinity domain used
442  * to perform the partition will be returned. */
443 
445  sizeof(ur_device_partition_property_t),
446  PI_ERROR_UNKNOWN);
447 
448  const uint32_t UrNumberElements =
449  *ParamValueSizeRet / sizeof(ur_device_partition_property_t);
450 
451  if (ParamValue) {
452  auto ParamValueCopy =
453  std::make_unique<ur_device_partition_property_t[]>(UrNumberElements);
454  std::memcpy(ParamValueCopy.get(), ParamValue,
455  UrNumberElements * sizeof(ur_device_partition_property_t));
456  pi_device_partition_property *pValuePI =
457  reinterpret_cast<pi_device_partition_property *>(ParamValue);
458  ur_device_partition_property_t *pValueUR =
459  reinterpret_cast<ur_device_partition_property_t *>(
460  ParamValueCopy.get());
461  const ur_device_partition_t Type = pValueUR->type;
462  *pValuePI = ConvertFunc(Type);
463  ++pValuePI;
464 
465  for (uint32_t i = 0; i < UrNumberElements; ++i) {
466  switch (pValueUR->type) {
467  case UR_DEVICE_PARTITION_EQUALLY: {
468  *pValuePI = pValueUR->value.equally;
469  break;
470  }
471  case UR_DEVICE_PARTITION_BY_COUNTS: {
472  *pValuePI = pValueUR->value.count;
473  break;
474  }
475  case UR_DEVICE_PARTITION_BY_AFFINITY_DOMAIN: {
476  *pValuePI = pValueUR->value.affinity_domain;
477  break;
478  }
479  case UR_DEVICE_PARTITION_BY_CSLICE: {
480  *pValuePI = 0;
481  break;
482  }
483  default:
484  die("UR_DEVICE_INFO_PARTITION_TYPE query returned unsupported type");
485  }
486  ++pValuePI;
487  ++pValueUR;
488  }
489  *pValuePI = 0;
490  }
491 
492  if (ParamValueSizeRet && *ParamValueSizeRet != 0) {
493  /* Add 2 extra elements to the return value (one for the type at the
494  * beginning and another to terminate the array with a 0 */
495  *ParamValueSizeRet =
496  (UrNumberElements + 2) * sizeof(pi_device_partition_property);
497  }
498  }
499 
500  else if (ParamName == UR_DEVICE_INFO_SUPPORTED_PARTITIONS) {
501  auto ConvertFunc = [](ur_device_partition_t UrValue) {
502  switch (static_cast<uint32_t>(UrValue)) {
503  case UR_DEVICE_PARTITION_EQUALLY:
505  case UR_DEVICE_PARTITION_BY_COUNTS:
507  case UR_DEVICE_PARTITION_BY_AFFINITY_DOMAIN:
509  case UR_DEVICE_PARTITION_BY_CSLICE:
511  default:
512  die("UR_DEVICE_INFO_SUPPORTED_PARTITIONS: unhandled value");
513  }
514  };
515 
516  Value.convertArray<ur_device_partition_t, pi_device_partition_property>(
517  ConvertFunc);
518 
519  if (ParamValue) {
520  const uint32_t NumberElements =
521  *ParamValueSizeRet / sizeof(pi_device_partition_property);
522  reinterpret_cast<pi_device_partition_property *>(
523  ParamValue)[NumberElements] = 0;
524  }
525 
526  if (ParamValueSizeRet && *ParamValueSizeRet != 0) {
527  *ParamValueSizeRet += sizeof(pi_device_partition_property);
528  }
529 
530  } else if (ParamName == UR_DEVICE_INFO_LOCAL_MEM_TYPE) {
531  auto ConvertFunc = [](ur_device_local_mem_type_t UrValue) {
532  switch (UrValue) {
533  case UR_DEVICE_LOCAL_MEM_TYPE_LOCAL:
535  case UR_DEVICE_LOCAL_MEM_TYPE_GLOBAL:
537  default:
538  die("UR_DEVICE_INFO_LOCAL_MEM_TYPE: unhandled value");
539  }
540  };
541  return Value.convert<ur_device_local_mem_type_t, pi_device_local_mem_type>(
542  ConvertFunc);
543  } else if (ParamName == UR_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES ||
544  ParamName == UR_DEVICE_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES) {
545  auto ConvertFunc = [](ur_memory_order_capability_flag_t UrValue) {
546  switch (UrValue) {
547  case UR_MEMORY_ORDER_CAPABILITY_FLAG_RELAXED:
549  case UR_MEMORY_ORDER_CAPABILITY_FLAG_ACQUIRE:
551  case UR_MEMORY_ORDER_CAPABILITY_FLAG_RELEASE:
553  case UR_MEMORY_ORDER_CAPABILITY_FLAG_ACQ_REL:
555  case UR_MEMORY_ORDER_CAPABILITY_FLAG_SEQ_CST:
557  default:
558  die("UR_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES: unhandled "
559  "value");
560  }
561  };
562  return Value.convertBitSet<ur_memory_order_capability_flag_t,
563  pi_memory_order_capabilities>(ConvertFunc);
564  } else if (ParamName == UR_DEVICE_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES ||
565  ParamName == UR_DEVICE_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES) {
566  auto ConvertFunc = [](ur_memory_scope_capability_flag_t UrValue) {
567  switch (UrValue) {
568  case UR_MEMORY_SCOPE_CAPABILITY_FLAG_WORK_ITEM:
570  case UR_MEMORY_SCOPE_CAPABILITY_FLAG_SUB_GROUP:
572  case UR_MEMORY_SCOPE_CAPABILITY_FLAG_WORK_GROUP:
574  case UR_MEMORY_SCOPE_CAPABILITY_FLAG_DEVICE:
575  return PI_MEMORY_SCOPE_DEVICE;
576  case UR_MEMORY_SCOPE_CAPABILITY_FLAG_SYSTEM:
577  return PI_MEMORY_SCOPE_SYSTEM;
578  default:
579  die("UR_DEVICE_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES: unhandled "
580  "value");
581  }
582  };
583  return Value.convertBitSet<ur_memory_scope_capability_flag_t,
584  pi_memory_scope_capabilities>(ConvertFunc);
585  } else if (*ParamValueSizeRet == 1 && ParamValueSize == 4) {
586  /* PI type: pi_bool
587  * UR type: ur_bool_t
588  * Need to convert from pi_bool (4 bytes) to ur_bool_t (1 byte)
589  */
590  fixupInfoValueTypes(*ParamValueSizeRet, ParamValueSizeRet, ParamValueSize,
591  ParamValue);
592  } else if (ParamName == UR_DEVICE_INFO_QUEUE_PROPERTIES ||
593  ParamName == UR_DEVICE_INFO_QUEUE_ON_DEVICE_PROPERTIES ||
594  ParamName == UR_DEVICE_INFO_QUEUE_ON_HOST_PROPERTIES ||
595  ParamName == UR_DEVICE_INFO_EXECUTION_CAPABILITIES ||
596  ParamName == UR_DEVICE_INFO_PARTITION_AFFINITY_DOMAIN ||
597  ParamName == UR_DEVICE_INFO_USM_HOST_SUPPORT ||
598  ParamName == UR_DEVICE_INFO_USM_DEVICE_SUPPORT ||
599  ParamName == UR_DEVICE_INFO_USM_SINGLE_SHARED_SUPPORT ||
600  ParamName == UR_DEVICE_INFO_USM_CROSS_SHARED_SUPPORT ||
601  ParamName == UR_DEVICE_INFO_USM_SYSTEM_SHARED_SUPPORT) {
602  /* PI type: pi_bitfield
603  * UR type: ur_flags_t (uint32_t)
604  * No need to convert since types are compatible
605  */
606  *ParamValueSizeRet = sizeof(pi_bitfield);
607  } else if (ParamName == UR_DEVICE_INFO_SINGLE_FP_CONFIG ||
608  ParamName == UR_DEVICE_INFO_HALF_FP_CONFIG ||
609  ParamName == UR_DEVICE_INFO_DOUBLE_FP_CONFIG) {
610  /* CL type: pi_device_fp_config
611  * UR type: ur_device_fp_capability_flags_t
612  * No need to convert since types are compatible
613  */
614  *ParamValueSizeRet = sizeof(pi_device_fp_config);
615  } else if (ParamName == UR_DEVICE_INFO_COMPONENT_DEVICES) {
616  if (ParamValueSizeRet && *ParamValueSizeRet != 0) {
617  const uint32_t UrNumberElements =
618  *ParamValueSizeRet / sizeof(ur_device_handle_t);
619  *ParamValueSizeRet = UrNumberElements * sizeof(pi_device);
620  }
621  } else {
622 
623  // TODO: what else needs a UR-PI translation?
624  }
625 
626  if (ParamValueSize && ParamValueSizeRet &&
627  ParamValueSize != *ParamValueSizeRet) {
628  fprintf(stderr, "UR DeviceInfoType=%d PI=%d but UR=%d\n", ParamName,
629  (int)ParamValueSize, (int)*ParamValueSizeRet);
630  die("ur2piDeviceInfoValue: size mismatch");
631  }
632  return Error;
633 }
634 
635 inline pi_result ur2piSamplerInfoValue(ur_sampler_info_t ParamName,
636  size_t ParamValueSizePI,
637  size_t *ParamValueSizeUR,
638  void *ParamValue) {
639 
640  ConvertHelper Value(ParamValueSizePI, ParamValue, ParamValueSizeUR);
641  switch (ParamName) {
642  case UR_SAMPLER_INFO_ADDRESSING_MODE: {
643  auto ConvertFunc = [](ur_sampler_addressing_mode_t UrValue) {
644  switch (UrValue) {
645  case UR_SAMPLER_ADDRESSING_MODE_CLAMP:
647  case UR_SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE:
649  case UR_SAMPLER_ADDRESSING_MODE_MIRRORED_REPEAT:
651  case UR_SAMPLER_ADDRESSING_MODE_NONE:
653  case UR_SAMPLER_ADDRESSING_MODE_REPEAT:
655 
656  default:
657  die("UR_SAMPLER_ADDRESSING_MODE_TYPE: unhandled value");
658  }
659  };
660  return Value
661  .convert<ur_sampler_addressing_mode_t, pi_sampler_addressing_mode>(
662  ConvertFunc);
663  }
664  case UR_SAMPLER_INFO_FILTER_MODE: {
665  auto ConvertFunc = [](ur_sampler_filter_mode_t UrValue) {
666  switch (UrValue) {
667  case UR_SAMPLER_FILTER_MODE_LINEAR:
669  case UR_SAMPLER_FILTER_MODE_NEAREST:
671  default:
672  die("UR_SAMPLER_FILTER_MODE: unhandled value");
673  }
674  };
675  return Value.convert<ur_sampler_filter_mode_t, pi_sampler_filter_mode>(
676  ConvertFunc);
677  }
678  default:
679  return PI_SUCCESS;
680  }
681 }
682 
683 // Translate UR device info values to PI info values
684 inline pi_result ur2piUSMAllocInfoValue(ur_usm_alloc_info_t ParamName,
685  size_t ParamValueSizePI,
686  size_t *ParamValueSizeUR,
687  void *ParamValue) {
688  ConvertHelper Value(ParamValueSizePI, ParamValue, ParamValueSizeUR);
689 
690  if (ParamName == UR_USM_ALLOC_INFO_TYPE) {
691  auto ConvertFunc = [](ur_usm_type_t UrValue) {
692  switch (UrValue) {
693  case UR_USM_TYPE_UNKNOWN:
694  return PI_MEM_TYPE_UNKNOWN;
695  case UR_USM_TYPE_HOST:
696  return PI_MEM_TYPE_HOST;
697  case UR_USM_TYPE_DEVICE:
698  return PI_MEM_TYPE_DEVICE;
699  case UR_USM_TYPE_SHARED:
700  return PI_MEM_TYPE_SHARED;
701  default:
702  die("UR_USM_ALLOC_INFO_TYPE: unhandled value");
703  }
704  };
705  return Value.convert<ur_usm_type_t, pi_usm_type>(ConvertFunc);
706  }
707 
708  return PI_SUCCESS;
709 }
710 
711 // Translate UR program build info values to PI info values
712 inline pi_result ur2piProgramBuildInfoValue(ur_program_build_info_t ParamName,
713  size_t ParamValueSizePI,
714  size_t *ParamValueSizeUR,
715  void *ParamValue) {
716  ConvertHelper Value(ParamValueSizePI, ParamValue, ParamValueSizeUR);
717 
718  if (ParamName == UR_PROGRAM_BUILD_INFO_BINARY_TYPE) {
719  auto ConvertFunc = [](ur_program_binary_type_t UrValue) {
720  switch (UrValue) {
721  case UR_PROGRAM_BINARY_TYPE_NONE:
723  case UR_PROGRAM_BINARY_TYPE_COMPILED_OBJECT:
725  case UR_PROGRAM_BINARY_TYPE_LIBRARY:
727  case UR_PROGRAM_BINARY_TYPE_EXECUTABLE:
729  default:
730  die("ur_program_binary_type_t: unhandled value");
731  }
732  };
733  return Value.convert<ur_program_binary_type_t, pi_program_binary_type>(
734  ConvertFunc);
735  }
736 
737  if (ParamName == UR_PROGRAM_BUILD_INFO_STATUS) {
738  auto ConvertFunc = [](ur_program_build_status_t UrValue) {
739  switch (UrValue) {
740  case UR_PROGRAM_BUILD_STATUS_NONE:
742  case UR_PROGRAM_BUILD_STATUS_ERROR:
744  case UR_PROGRAM_BUILD_STATUS_SUCCESS:
746  case UR_PROGRAM_BUILD_STATUS_IN_PROGRESS:
748  default:
749  die("ur_program_build_status_t: unhandled value");
750  }
751  };
752  return Value.convert<ur_program_build_status_t, pi_program_build_status>(
753  ConvertFunc);
754  }
755 
756  return PI_SUCCESS;
757 }
758 
759 inline ur_result_t
761  ur_program_metadata_t *ur_metadata) {
762  ur_metadata->pName = (*pi_metadata)->Name;
763  ur_metadata->size = (*pi_metadata)->ValSize;
764  switch ((*pi_metadata)->Type) {
766  ur_metadata->type = UR_PROGRAM_METADATA_TYPE_UINT32;
767  ur_metadata->value.data32 = (*pi_metadata)->ValSize;
768  return UR_RESULT_SUCCESS;
770  ur_metadata->type = UR_PROGRAM_METADATA_TYPE_BYTE_ARRAY;
771  ur_metadata->value.pData = (*pi_metadata)->ValAddr;
772  return UR_RESULT_SUCCESS;
774  ur_metadata->type = UR_PROGRAM_METADATA_TYPE_STRING;
775  ur_metadata->value.pString =
776  reinterpret_cast<char *>((*pi_metadata)->ValAddr);
777  return UR_RESULT_SUCCESS;
778  default:
779  return UR_RESULT_ERROR_INVALID_VALUE;
780  }
781 }
782 
783 namespace pi2ur {
784 
785 inline pi_result piTearDown(void *PluginParameter) {
786  bool *pluginTeardown = static_cast<bool *>(PluginParameter);
787  *pluginTeardown = true;
788  // Fetch the single known adapter (the one which is statically linked) so we
789  // can release it. Fetching it for a second time (after piPlatformsGet)
790  // increases the reference count, so we need to release it twice.
791  // pi_unified_runtime has its own implementation of piTearDown.
792  static std::once_flag AdapterReleaseFlag;
793  ur_adapter_handle_t Adapter;
794  ur_result_t Ret = UR_RESULT_SUCCESS;
795  std::call_once(AdapterReleaseFlag, [&]() {
796  Ret = urAdapterGet(1, &Adapter, nullptr);
797  if (Ret == UR_RESULT_SUCCESS) {
798  Ret = urAdapterRelease(Adapter);
799  Ret = urAdapterRelease(Adapter);
800  }
801  });
802  HANDLE_ERRORS(Ret);
803 
804  return PI_SUCCESS;
805 }
806 
807 inline pi_result PiGetAdapter(ur_adapter_handle_t &adapter) {
808  // We're not going through the UR loader so we're guaranteed to have exactly
809  // one adapter (whichever is statically linked). The PI plugin for UR has its
810  // own implementation of piPlatformsGet.
811  static ur_adapter_handle_t Adapter;
812  static std::once_flag AdapterGetFlag;
813  ur_result_t Ret = UR_RESULT_SUCCESS;
814  std::call_once(AdapterGetFlag,
815  [&Ret]() { Ret = urAdapterGet(1, &Adapter, nullptr); });
816  HANDLE_ERRORS(Ret);
817 
818  adapter = Adapter;
819 
820  return PI_SUCCESS;
821 }
822 
824 // Platform
825 inline pi_result piPlatformsGet(pi_uint32 NumEntries, pi_platform *Platforms,
826  pi_uint32 *NumPlatforms) {
827  ur_adapter_handle_t adapter = nullptr;
828  if (auto res = PiGetAdapter(adapter); res != PI_SUCCESS) {
829  return res;
830  }
831 
832  auto phPlatforms = reinterpret_cast<ur_platform_handle_t *>(Platforms);
834  urPlatformGet(&adapter, 1, NumEntries, phPlatforms, NumPlatforms));
835  return PI_SUCCESS;
836 }
837 
839  pi_native_handle *NativeHandle) {
840 
841  PI_ASSERT(Platform, PI_ERROR_INVALID_PLATFORM);
842  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
843 
844  auto UrPlatform = reinterpret_cast<ur_platform_handle_t>(Platform);
845 
846  ur_native_handle_t UrNativeHandle{};
847  HANDLE_ERRORS(urPlatformGetNativeHandle(UrPlatform, &UrNativeHandle));
848 
849  *NativeHandle = reinterpret_cast<pi_native_handle>(UrNativeHandle);
850 
851  return PI_SUCCESS;
852 }
853 
854 inline pi_result
856  pi_platform *Platform) {
857 
858  PI_ASSERT(Platform, PI_ERROR_INVALID_PLATFORM);
859  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
860 
861  ur_adapter_handle_t adapter = nullptr;
862  if (auto res = PiGetAdapter(adapter); res != PI_SUCCESS) {
863  return res;
864  }
865  (void)adapter;
866 
867  ur_platform_handle_t UrPlatform{};
868  ur_native_handle_t UrNativeHandle =
869  reinterpret_cast<ur_native_handle_t>(NativeHandle);
870  ur_platform_native_properties_t UrProperties{};
871  urPlatformCreateWithNativeHandle(UrNativeHandle, &UrProperties, &UrPlatform);
872 
873  *Platform = reinterpret_cast<pi_platform>(UrPlatform);
874 
875  return PI_SUCCESS;
876 }
877 
879  pi_platform_info ParamName,
880  size_t ParamValueSize, void *ParamValue,
881  size_t *ParamValueSizeRet) {
882 
883  PI_ASSERT(Platform, PI_ERROR_INVALID_PLATFORM);
884 
885  ur_platform_info_t UrParamName = {};
886  switch (ParamName) {
888  UrParamName = UR_PLATFORM_INFO_EXTENSIONS;
889  break;
890  }
891  case PI_PLATFORM_INFO_NAME: {
892  UrParamName = UR_PLATFORM_INFO_NAME;
893  break;
894  }
896  UrParamName = UR_PLATFORM_INFO_PROFILE;
897  break;
898  }
900  UrParamName = UR_PLATFORM_INFO_VENDOR_NAME;
901  break;
902  }
904  UrParamName = UR_PLATFORM_INFO_VERSION;
905  break;
906  }
908  UrParamName = UR_PLATFORM_INFO_BACKEND;
909  break;
910  }
911  default:
912  die("urGetContextInfo: unsuppported ParamName.");
913  }
914 
915  size_t UrParamValueSizeRet;
916  auto UrPlatform = reinterpret_cast<ur_platform_handle_t>(Platform);
917  HANDLE_ERRORS(urPlatformGetInfo(UrPlatform, UrParamName, ParamValueSize,
918  ParamValue, &UrParamValueSizeRet));
919 
920  if (ParamValueSizeRet) {
921  *ParamValueSizeRet = UrParamValueSizeRet;
922  }
923  ur2piPlatformInfoValue(UrParamName, ParamValueSize, &ParamValueSize,
924  ParamValue);
925  fixupInfoValueTypes(UrParamValueSizeRet, ParamValueSizeRet, ParamValueSize,
926  ParamValue);
927 
928  return PI_SUCCESS;
929 }
930 
931 inline pi_result piextPluginGetOpaqueData(void *opaque_data_param,
932  void **opaque_data_return) {
933  (void)opaque_data_param;
934  (void)opaque_data_return;
935  return PI_ERROR_UNKNOWN;
936 }
937 
939  const char *FrontendOption,
940  const char **PlatformOption) {
941 
942  auto UrPlatform = reinterpret_cast<ur_platform_handle_t>(Platform);
944  urPlatformGetBackendOption(UrPlatform, FrontendOption, PlatformOption));
945 
946  return PI_SUCCESS;
947 }
948 
949 // Platform
951 
953 // Device
954 inline pi_result piDevicesGet(pi_platform Platform, pi_device_type DeviceType,
955  pi_uint32 NumEntries, pi_device *Devices,
956  pi_uint32 *NumDevices) {
957  ur_device_type_t Type;
958  switch (DeviceType) {
959  case PI_DEVICE_TYPE_ALL:
960  Type = UR_DEVICE_TYPE_ALL;
961  break;
962  case PI_DEVICE_TYPE_GPU:
963  Type = UR_DEVICE_TYPE_GPU;
964  break;
965  case PI_DEVICE_TYPE_CPU:
966  Type = UR_DEVICE_TYPE_CPU;
967  break;
968  case PI_DEVICE_TYPE_ACC:
969  Type = UR_DEVICE_TYPE_FPGA;
970  break;
971  default:
972  return PI_ERROR_UNKNOWN;
973  }
974 
975  PI_ASSERT(Platform, PI_ERROR_INVALID_PLATFORM);
976 
977  auto UrPlatform = reinterpret_cast<ur_platform_handle_t>(Platform);
978  auto UrDevices = reinterpret_cast<ur_device_handle_t *>(Devices);
980  urDeviceGet(UrPlatform, Type, NumEntries, UrDevices, NumDevices));
981 
982  return PI_SUCCESS;
983 }
984 
986  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
987  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
988  HANDLE_ERRORS(urDeviceRetain(UrDevice));
989  return PI_SUCCESS;
990 }
991 
993  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
994 
995  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
996  HANDLE_ERRORS(urDeviceRelease(UrDevice));
997  return PI_SUCCESS;
998 }
999 
1000 inline pi_result piPluginGetLastError(char **Message) {
1001  // We're not going through the UR loader so we're guaranteed to have exactly
1002  // one adapter (whichever is statically linked). The PI plugin for UR has its
1003  // own implementation of piPluginGetLastError. Materialize the adapter
1004  // reference for the urAdapterGetLastError call, then release it.
1005  ur_adapter_handle_t Adapter;
1006  urAdapterGet(1, &Adapter, nullptr);
1007  // FIXME: ErrorCode should store a native error, but these are not being used
1008  // in CUDA adapter at the moment
1009  int32_t ErrorCode;
1010  ur_result_t Res = urAdapterGetLastError(
1011  Adapter, const_cast<const char **>(Message), &ErrorCode);
1012  urAdapterRelease(Adapter);
1013 
1014  return ur2piResult(Res);
1015 }
1016 
1018  size_t ParamValueSize, void *ParamValue,
1019  size_t *ParamValueSizeRet) {
1020  ur_device_info_t InfoType;
1021  switch (ParamName) {
1022 #define PI_TO_UR_MAP_DEVICE_INFO(FROM, TO) \
1023  case FROM: { \
1024  InfoType = TO; \
1025  break; \
1026  }
1027  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_TYPE, UR_DEVICE_INFO_TYPE)
1029  UR_DEVICE_INFO_PARENT_DEVICE)
1030  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_PLATFORM, UR_DEVICE_INFO_PLATFORM)
1031  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_VENDOR_ID, UR_DEVICE_INFO_VENDOR_ID)
1032  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_UUID, UR_DEVICE_INFO_UUID)
1033  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_ATOMIC_64, UR_DEVICE_INFO_ATOMIC_64)
1035  UR_DEVICE_INFO_EXTENSIONS)
1036  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_NAME, UR_DEVICE_INFO_NAME)
1038  UR_DEVICE_INFO_COMPILER_AVAILABLE)
1040  UR_DEVICE_INFO_LINKER_AVAILABLE)
1042  UR_DEVICE_INFO_MAX_COMPUTE_UNITS)
1044  UR_DEVICE_INFO_MAX_WORK_ITEM_DIMENSIONS)
1046  UR_DEVICE_INFO_MAX_WORK_GROUP_SIZE)
1048  UR_DEVICE_INFO_MAX_WORK_ITEM_SIZES)
1050  UR_DEVICE_INFO_MAX_CLOCK_FREQUENCY)
1052  UR_DEVICE_INFO_ADDRESS_BITS)
1054  UR_DEVICE_INFO_MAX_MEM_ALLOC_SIZE)
1056  UR_DEVICE_INFO_GLOBAL_MEM_SIZE)
1058  UR_DEVICE_INFO_LOCAL_MEM_SIZE)
1060  UR_DEVICE_INFO_IMAGE_SUPPORTED)
1062  UR_DEVICE_INFO_HOST_UNIFIED_MEMORY)
1063  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_AVAILABLE, UR_DEVICE_INFO_AVAILABLE)
1064  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_VENDOR, UR_DEVICE_INFO_VENDOR)
1066  UR_DEVICE_INFO_DRIVER_VERSION)
1067  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_VERSION, UR_DEVICE_INFO_VERSION)
1069  UR_DEVICE_INFO_PARTITION_MAX_SUB_DEVICES)
1071  UR_DEVICE_INFO_REFERENCE_COUNT)
1073  UR_DEVICE_INFO_SUPPORTED_PARTITIONS)
1075  UR_DEVICE_INFO_PARTITION_AFFINITY_DOMAIN)
1077  UR_DEVICE_INFO_PARTITION_TYPE)
1079  UR_EXT_DEVICE_INFO_OPENCL_C_VERSION)
1081  UR_DEVICE_INFO_PREFERRED_INTEROP_USER_SYNC)
1083  UR_DEVICE_INFO_PRINTF_BUFFER_SIZE)
1084  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_PROFILE, UR_DEVICE_INFO_PROFILE)
1086  UR_DEVICE_INFO_BUILT_IN_KERNELS)
1088  UR_DEVICE_INFO_QUEUE_PROPERTIES)
1090  UR_DEVICE_INFO_EXECUTION_CAPABILITIES)
1092  UR_DEVICE_INFO_ENDIAN_LITTLE)
1094  UR_DEVICE_INFO_ERROR_CORRECTION_SUPPORT)
1096  UR_DEVICE_INFO_PROFILING_TIMER_RESOLUTION)
1098  UR_DEVICE_INFO_LOCAL_MEM_TYPE)
1100  UR_DEVICE_INFO_MAX_CONSTANT_ARGS)
1102  UR_DEVICE_INFO_MAX_CONSTANT_BUFFER_SIZE)
1104  UR_DEVICE_INFO_GLOBAL_MEM_CACHE_TYPE)
1106  UR_DEVICE_INFO_GLOBAL_MEM_CACHELINE_SIZE)
1108  UR_DEVICE_INFO_GLOBAL_MEM_CACHE_SIZE)
1110  UR_DEVICE_INFO_MAX_PARAMETER_SIZE)
1112  UR_DEVICE_INFO_MEM_BASE_ADDR_ALIGN)
1114  UR_DEVICE_INFO_MAX_SAMPLERS)
1116  UR_DEVICE_INFO_MAX_READ_IMAGE_ARGS)
1118  UR_DEVICE_INFO_MAX_WRITE_IMAGE_ARGS)
1120  UR_DEVICE_INFO_SINGLE_FP_CONFIG)
1122  UR_DEVICE_INFO_HALF_FP_CONFIG)
1124  UR_DEVICE_INFO_DOUBLE_FP_CONFIG)
1126  UR_DEVICE_INFO_IMAGE2D_MAX_WIDTH)
1128  UR_DEVICE_INFO_IMAGE2D_MAX_HEIGHT)
1130  UR_DEVICE_INFO_IMAGE3D_MAX_WIDTH)
1132  UR_DEVICE_INFO_IMAGE3D_MAX_HEIGHT)
1134  UR_DEVICE_INFO_IMAGE3D_MAX_DEPTH)
1136  UR_DEVICE_INFO_IMAGE_MAX_BUFFER_SIZE)
1138  UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR)
1140  UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_CHAR)
1142  UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT)
1144  UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_SHORT)
1146  UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT)
1148  UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_INT)
1150  UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG)
1152  UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_LONG)
1154  UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT)
1156  UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_FLOAT)
1158  UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE)
1160  UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_DOUBLE)
1162  UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF)
1164  UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_HALF)
1166  UR_DEVICE_INFO_MAX_NUM_SUB_GROUPS)
1169  UR_DEVICE_INFO_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS)
1171  UR_DEVICE_INFO_SUB_GROUP_SIZES_INTEL)
1173  UR_DEVICE_INFO_IL_VERSION)
1175  UR_DEVICE_INFO_USM_HOST_SUPPORT)
1177  UR_DEVICE_INFO_USM_DEVICE_SUPPORT)
1179  UR_DEVICE_INFO_USM_SINGLE_SHARED_SUPPORT)
1181  UR_DEVICE_INFO_USM_CROSS_SHARED_SUPPORT)
1183  UR_DEVICE_INFO_USM_SYSTEM_SHARED_SUPPORT)
1185  UR_DEVICE_INFO_PCI_ADDRESS)
1187  UR_DEVICE_INFO_GPU_EU_COUNT)
1189  UR_DEVICE_INFO_GPU_EU_SIMD_WIDTH)
1191  UR_DEVICE_INFO_GPU_SUBSLICES_PER_SLICE)
1193  UR_DEVICE_INFO_IP_VERSION)
1195  UR_DEVICE_INFO_BUILD_ON_SUBDEVICE)
1197  UR_DEVICE_INFO_MAX_WORK_GROUPS_3D)
1199  UR_DEVICE_INFO_IMAGE_MAX_ARRAY_SIZE)
1200  PI_TO_UR_MAP_DEVICE_INFO(PI_DEVICE_INFO_DEVICE_ID, UR_DEVICE_INFO_DEVICE_ID)
1202  UR_DEVICE_INFO_GLOBAL_MEM_FREE)
1204  UR_DEVICE_INFO_MEMORY_CLOCK_RATE)
1206  UR_DEVICE_INFO_MEMORY_BUS_WIDTH)
1208  UR_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES)
1210  UR_DEVICE_INFO_GPU_EU_SLICES)
1212  UR_DEVICE_INFO_GPU_EU_COUNT_PER_SUBSLICE)
1214  UR_DEVICE_INFO_GPU_HW_THREADS_PER_EU)
1216  UR_DEVICE_INFO_MAX_MEMORY_BANDWIDTH)
1218  UR_DEVICE_INFO_BFLOAT16)
1221  UR_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES)
1224  UR_DEVICE_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES)
1226  UR_DEVICE_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES)
1228  UR_DEVICE_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES)
1230  UR_DEVICE_INFO_MEM_CHANNEL_SUPPORT)
1232  UR_DEVICE_INFO_IMAGE_SRGB)
1234  UR_DEVICE_INFO_BACKEND_RUNTIME_VERSION)
1237  UR_DEVICE_INFO_MAX_REGISTERS_PER_WORK_GROUP)
1239  UR_DEVICE_INFO_BINDLESS_IMAGES_SUPPORT_EXP)
1242  UR_DEVICE_INFO_BINDLESS_IMAGES_SHARED_USM_SUPPORT_EXP)
1245  UR_DEVICE_INFO_BINDLESS_IMAGES_1D_USM_SUPPORT_EXP)
1248  UR_DEVICE_INFO_BINDLESS_IMAGES_2D_USM_SUPPORT_EXP)
1250  UR_DEVICE_INFO_IMAGE_PITCH_ALIGN_EXP)
1252  UR_DEVICE_INFO_MAX_IMAGE_LINEAR_WIDTH_EXP)
1254  UR_DEVICE_INFO_MAX_IMAGE_LINEAR_HEIGHT_EXP)
1256  UR_DEVICE_INFO_MAX_IMAGE_LINEAR_PITCH_EXP)
1258  UR_DEVICE_INFO_MIPMAP_SUPPORT_EXP)
1261  UR_DEVICE_INFO_MIPMAP_ANISOTROPY_SUPPORT_EXP)
1263  UR_DEVICE_INFO_MIPMAP_MAX_ANISOTROPY_EXP)
1266  UR_DEVICE_INFO_MIPMAP_LEVEL_REFERENCE_SUPPORT_EXP)
1268  UR_DEVICE_INFO_CUBEMAP_SUPPORT_EXP)
1271  UR_DEVICE_INFO_CUBEMAP_SEAMLESS_FILTERING_SUPPORT_EXP)
1274  UR_DEVICE_INFO_INTEROP_MEMORY_IMPORT_SUPPORT_EXP)
1277  UR_DEVICE_INFO_INTEROP_MEMORY_EXPORT_SUPPORT_EXP)
1280  UR_DEVICE_INFO_INTEROP_SEMAPHORE_IMPORT_SUPPORT_EXP)
1283  UR_DEVICE_INFO_INTEROP_SEMAPHORE_EXPORT_SUPPORT_EXP)
1285  UR_DEVICE_INFO_ESIMD_SUPPORT)
1287  UR_DEVICE_INFO_COMPONENT_DEVICES)
1289  UR_DEVICE_INFO_COMPOSITE_DEVICE)
1291  UR_DEVICE_INFO_COMMAND_BUFFER_SUPPORT_EXP)
1294  UR_DEVICE_INFO_COMMAND_BUFFER_UPDATE_SUPPORT_EXP)
1295 #undef PI_TO_UR_MAP_DEVICE_INFO
1296  default:
1297  return PI_ERROR_UNKNOWN;
1298  };
1299 
1300  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
1301 
1302  size_t ParamValueSizeRetUR;
1303  auto DeviceUR = reinterpret_cast<ur_device_handle_t>(Device);
1304 
1305  HANDLE_ERRORS(urDeviceGetInfo(DeviceUR, InfoType, ParamValueSize, ParamValue,
1306  &ParamValueSizeRetUR));
1307 
1308  ur2piDeviceInfoValue(InfoType, ParamValueSize, ParamValue,
1309  &ParamValueSizeRetUR);
1310 
1311  if (ParamValueSizeRet) {
1312  *ParamValueSizeRet = ParamValueSizeRetUR;
1313  }
1314 
1315  return PI_SUCCESS;
1316 }
1317 
1319  pi_native_handle *NativeHandle) {
1320  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
1321  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
1322 
1323  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
1324 
1325  ur_native_handle_t UrNativeHandle{};
1326  HANDLE_ERRORS(urDeviceGetNativeHandle(UrDevice, &UrNativeHandle));
1327  *NativeHandle = reinterpret_cast<pi_native_handle>(UrNativeHandle);
1328  return PI_SUCCESS;
1329 }
1330 
1331 inline pi_result
1333  pi_platform Platform, pi_device *Device) {
1334 
1335  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
1336  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
1337 
1338  ur_adapter_handle_t adapter = nullptr;
1339  if (auto res = PiGetAdapter(adapter); res != PI_SUCCESS) {
1340  return res;
1341  }
1342  (void)adapter;
1343 
1344  ur_native_handle_t UrNativeDevice =
1345  reinterpret_cast<ur_native_handle_t>(NativeHandle);
1346  ur_platform_handle_t UrPlatform =
1347  reinterpret_cast<ur_platform_handle_t>(Platform);
1348  auto UrDevice = reinterpret_cast<ur_device_handle_t *>(Device);
1349  ur_device_native_properties_t UrProperties{};
1350  HANDLE_ERRORS(urDeviceCreateWithNativeHandle(UrNativeDevice, UrPlatform,
1351  &UrProperties, UrDevice));
1352 
1353  return PI_SUCCESS;
1354 }
1355 
1357  pi_device Device, const pi_device_partition_property *Properties,
1358  pi_uint32 NumEntries, pi_device *SubDevices, pi_uint32 *NumSubDevices) {
1359 
1360  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
1361 
1362  if (!Properties || !Properties[0]) {
1363  return PI_ERROR_INVALID_VALUE;
1364  }
1365 
1366  ur_device_partition_t UrType;
1367  switch (Properties[0]) {
1369  UrType = UR_DEVICE_PARTITION_EQUALLY;
1370  break;
1372  UrType = UR_DEVICE_PARTITION_BY_COUNTS;
1373  break;
1375  UrType = UR_DEVICE_PARTITION_BY_AFFINITY_DOMAIN;
1376  break;
1378  UrType = UR_DEVICE_PARTITION_BY_CSLICE;
1379  break;
1380  default:
1381  return PI_ERROR_UNKNOWN;
1382  }
1383 
1384  std::vector<ur_device_partition_property_t> UrProperties{};
1385 
1386  // UR_DEVICE_PARTITION_BY_CSLICE doesn't have a value, so
1387  // handle it outside the while loop below.
1388  if (UrType == UR_DEVICE_PARTITION_BY_CSLICE) {
1389  ur_device_partition_property_t UrProperty{};
1390  UrProperty.type = UrType;
1391  UrProperties.push_back(UrProperty);
1392  }
1393  while (*(++Properties)) {
1394  ur_device_partition_property_t UrProperty;
1395  UrProperty.type = UrType;
1396  switch (UrType) {
1397  case UR_DEVICE_PARTITION_EQUALLY: {
1398  UrProperty.value.equally = *Properties;
1399  break;
1400  }
1401  case UR_DEVICE_PARTITION_BY_COUNTS: {
1402  UrProperty.value.count = *Properties;
1403  break;
1404  }
1405  case UR_DEVICE_PARTITION_BY_AFFINITY_DOMAIN: {
1406  /* No need to convert affinity domain enums from pi to ur because they
1407  * are equivalent */
1408  UrProperty.value.affinity_domain = *Properties;
1409  break;
1410  }
1411  default: {
1412  die("Invalid properties for call to piDevicePartition");
1413  }
1414  }
1415  UrProperties.push_back(UrProperty);
1416  }
1417 
1418  const ur_device_partition_properties_t UrPropertiesStruct{
1419  UR_STRUCTURE_TYPE_DEVICE_PARTITION_PROPERTIES,
1420  nullptr,
1421  UrProperties.data(),
1422  UrProperties.size(),
1423  };
1424 
1425  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
1426  auto UrSubDevices = reinterpret_cast<ur_device_handle_t *>(SubDevices);
1427  HANDLE_ERRORS(urDevicePartition(UrDevice, &UrPropertiesStruct, NumEntries,
1428  UrSubDevices, NumSubDevices));
1429  return PI_SUCCESS;
1430 }
1431 
1432 inline pi_result piGetDeviceAndHostTimer(pi_device Device, uint64_t *DeviceTime,
1433  uint64_t *HostTime) {
1434  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
1435  HANDLE_ERRORS(urDeviceGetGlobalTimestamps(UrDevice, DeviceTime, HostTime));
1436  return PI_SUCCESS;
1437 }
1438 
1439 inline pi_result
1440 piextDeviceSelectBinary(pi_device Device, // TODO: does this need to be context?
1441  pi_device_binary *Binaries, pi_uint32 NumBinaries,
1442  pi_uint32 *SelectedBinaryInd) {
1443 
1444  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
1445  std::vector<ur_device_binary_t> UrBinaries(NumBinaries);
1446 
1447  for (uint32_t BinaryCount = 0; BinaryCount < NumBinaries; BinaryCount++) {
1448  if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1450  UrBinaries[BinaryCount].pDeviceTargetSpec =
1451  UR_DEVICE_BINARY_TARGET_UNKNOWN;
1452  else if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1454  UrBinaries[BinaryCount].pDeviceTargetSpec =
1455  UR_DEVICE_BINARY_TARGET_SPIRV32;
1456  else if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1458  UrBinaries[BinaryCount].pDeviceTargetSpec =
1459  UR_DEVICE_BINARY_TARGET_SPIRV64;
1460  else if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1462  UrBinaries[BinaryCount].pDeviceTargetSpec =
1463  UR_DEVICE_BINARY_TARGET_SPIRV64_X86_64;
1464  else if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1466  UrBinaries[BinaryCount].pDeviceTargetSpec =
1467  UR_DEVICE_BINARY_TARGET_SPIRV64_GEN;
1468  else if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1470  UrBinaries[BinaryCount].pDeviceTargetSpec =
1471  UR_DEVICE_BINARY_TARGET_SPIRV64_FPGA;
1472  else if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1474  UrBinaries[BinaryCount].pDeviceTargetSpec =
1475  UR_DEVICE_BINARY_TARGET_NVPTX64;
1476  else if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1478  UrBinaries[BinaryCount].pDeviceTargetSpec =
1479  UR_DEVICE_BINARY_TARGET_AMDGCN;
1480  else if (strcmp(Binaries[BinaryCount]->DeviceTargetSpec,
1482  UrBinaries[BinaryCount].pDeviceTargetSpec =
1483  "native_cpu"; // todo: define UR_DEVICE_BINARY_TARGET_NATIVE_CPU;
1484  else
1485  UrBinaries[BinaryCount].pDeviceTargetSpec =
1486  UR_DEVICE_BINARY_TARGET_UNKNOWN;
1487  }
1488 
1489  HANDLE_ERRORS(urDeviceSelectBinary(UrDevice, UrBinaries.data(), NumBinaries,
1490  SelectedBinaryInd));
1491  return PI_SUCCESS;
1492 }
1493 
1494 // Device
1496 
1498 // Context
1500  pi_uint32 NumDevices, const pi_device *Devices,
1501  void (*PFnNotify)(const char *ErrInfo,
1502  const void *PrivateInfo,
1503  size_t CB, void *UserData),
1504  void *UserData, pi_context *RetContext) {
1505  std::ignore = Properties;
1506  std::ignore = PFnNotify;
1507  std::ignore = UserData;
1508  auto UrDevices = reinterpret_cast<const ur_device_handle_t *>(Devices);
1509 
1510  ur_context_handle_t *UrContext =
1511  reinterpret_cast<ur_context_handle_t *>(RetContext);
1512  // TODO: Parse PI Context Properties into UR
1513  ur_context_properties_t UrProperties{};
1514  HANDLE_ERRORS(
1515  urContextCreate(NumDevices, UrDevices, &UrProperties, UrContext));
1516  return PI_SUCCESS;
1517 }
1518 
1520  pi_context Context, pi_context_extended_deleter Function, void *UserData) {
1521  auto hContext = reinterpret_cast<ur_context_handle_t>(Context);
1522 
1523  HANDLE_ERRORS(urContextSetExtendedDeleter(hContext, Function, UserData));
1524 
1525  return PI_SUCCESS;
1526 }
1527 
1529  pi_native_handle *NativeHandle) {
1530 
1531  ur_context_handle_t UrContext =
1532  reinterpret_cast<ur_context_handle_t>(Context);
1533  ur_native_handle_t UrNativeHandle{};
1534  HANDLE_ERRORS(urContextGetNativeHandle(UrContext, &UrNativeHandle));
1535  *NativeHandle = reinterpret_cast<pi_native_handle>(UrNativeHandle);
1536  return PI_SUCCESS;
1537 }
1538 
1540  pi_native_handle NativeHandle, pi_uint32 NumDevices,
1541  const pi_device *Devices, bool OwnNativeHandle, pi_context *RetContext) {
1542  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
1543  PI_ASSERT(RetContext, PI_ERROR_INVALID_VALUE);
1544 
1545  ur_adapter_handle_t adapter = nullptr;
1546  if (auto res = PiGetAdapter(adapter); res != PI_SUCCESS) {
1547  return res;
1548  }
1549  (void)adapter;
1550 
1551  ur_native_handle_t NativeContext =
1552  reinterpret_cast<ur_native_handle_t>(NativeHandle);
1553  const ur_device_handle_t *UrDevices =
1554  reinterpret_cast<const ur_device_handle_t *>(Devices);
1555  ur_context_handle_t *UrContext =
1556  reinterpret_cast<ur_context_handle_t *>(RetContext);
1557 
1558  ur_context_native_properties_t Properties{
1559  UR_STRUCTURE_TYPE_CONTEXT_NATIVE_PROPERTIES, nullptr, OwnNativeHandle};
1560 
1561  HANDLE_ERRORS(urContextCreateWithNativeHandle(
1562  NativeContext, NumDevices, UrDevices, &Properties, UrContext));
1563 
1564  return PI_SUCCESS;
1565 }
1566 
1568  size_t ParamValueSize, void *ParamValue,
1569  size_t *ParamValueSizeRet) {
1570 
1571  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
1572 
1573  ur_context_handle_t hContext = reinterpret_cast<ur_context_handle_t>(Context);
1574  ur_context_info_t ContextInfoType{};
1575 
1576  switch (ParamName) {
1577  case PI_CONTEXT_INFO_DEVICES: {
1578  ContextInfoType = UR_CONTEXT_INFO_DEVICES;
1579  break;
1580  }
1582  ContextInfoType = UR_CONTEXT_INFO_NUM_DEVICES;
1583  break;
1584  }
1586  ContextInfoType = UR_CONTEXT_INFO_REFERENCE_COUNT;
1587  break;
1588  }
1591  ContextInfoType = UR_CONTEXT_INFO_USM_FILL2D_SUPPORT;
1592  break;
1593  }
1595  ContextInfoType = UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT;
1596  break;
1597  }
1602  // These queries should be dealt with in context_impl.cpp by calling the
1603  // queries of each device separately and building the intersection set.
1604  die("These queries should have never come here");
1605  }
1606  default: {
1607  die("piContextGetInfo: unsuppported ParamName.");
1608  }
1609  }
1610 
1611  size_t UrParamValueSizeRet;
1612  HANDLE_ERRORS(urContextGetInfo(hContext, ContextInfoType, ParamValueSize,
1613  ParamValue, &UrParamValueSizeRet));
1614  if (ParamValueSizeRet) {
1615  *ParamValueSizeRet = UrParamValueSizeRet;
1616  }
1617  fixupInfoValueTypes(UrParamValueSizeRet, ParamValueSizeRet, ParamValueSize,
1618  ParamValue);
1619  return PI_SUCCESS;
1620 }
1621 
1623  ur_context_handle_t hContext = reinterpret_cast<ur_context_handle_t>(Context);
1624 
1625  HANDLE_ERRORS(urContextRetain(hContext));
1626 
1627  return PI_SUCCESS;
1628 }
1629 
1631  ur_context_handle_t UrContext =
1632  reinterpret_cast<ur_context_handle_t>(Context);
1633  HANDLE_ERRORS(urContextRelease(UrContext));
1634  return PI_SUCCESS;
1635 }
1636 // Context
1638 
1640 // Queue
1642  pi_queue_properties *Properties,
1643  pi_queue *Queue) {
1644 
1645  PI_ASSERT(Properties, PI_ERROR_INVALID_VALUE);
1646  // Expect flags mask to be passed first.
1647  PI_ASSERT(Properties[0] == PI_QUEUE_FLAGS, PI_ERROR_INVALID_VALUE);
1648 
1649  PI_ASSERT(Properties[2] == 0 ||
1650  (Properties[2] == PI_QUEUE_COMPUTE_INDEX && Properties[4] == 0),
1651  PI_ERROR_INVALID_VALUE);
1652 
1653  // Check that unexpected bits are not set.
1654  PI_ASSERT(!(Properties[1] &
1663  PI_ERROR_INVALID_VALUE);
1664 
1665  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
1666  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
1667  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
1668 
1669  ur_queue_properties_t UrProperties{};
1670  UrProperties.stype = UR_STRUCTURE_TYPE_QUEUE_PROPERTIES;
1671  if (Properties[1] & PI_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE)
1672  UrProperties.flags |= UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE;
1673  if (Properties[1] & PI_QUEUE_FLAG_PROFILING_ENABLE)
1674  UrProperties.flags |= UR_QUEUE_FLAG_PROFILING_ENABLE;
1675  if (Properties[1] & PI_QUEUE_FLAG_ON_DEVICE)
1676  UrProperties.flags |= UR_QUEUE_FLAG_ON_DEVICE;
1677  if (Properties[1] & PI_QUEUE_FLAG_ON_DEVICE_DEFAULT)
1678  UrProperties.flags |= UR_QUEUE_FLAG_ON_DEVICE_DEFAULT;
1679  if (Properties[1] & PI_EXT_ONEAPI_QUEUE_FLAG_DISCARD_EVENTS)
1680  UrProperties.flags |= UR_QUEUE_FLAG_DISCARD_EVENTS;
1681  if (Properties[1] & PI_EXT_ONEAPI_QUEUE_FLAG_PRIORITY_LOW)
1682  UrProperties.flags |= UR_QUEUE_FLAG_PRIORITY_LOW;
1683  if (Properties[1] & PI_EXT_ONEAPI_QUEUE_FLAG_PRIORITY_HIGH)
1684  UrProperties.flags |= UR_QUEUE_FLAG_PRIORITY_HIGH;
1685  if (Properties[1] & __SYCL_PI_CUDA_SYNC_WITH_DEFAULT)
1686  UrProperties.flags |= UR_QUEUE_FLAG_SYNC_WITH_DEFAULT_STREAM;
1687  if (Properties[1] & __SYCL_PI_CUDA_USE_DEFAULT_STREAM)
1688  UrProperties.flags |= UR_QUEUE_FLAG_USE_DEFAULT_STREAM;
1689  if (Properties[1] & PI_EXT_QUEUE_FLAG_SUBMISSION_NO_IMMEDIATE)
1690  UrProperties.flags |= UR_QUEUE_FLAG_SUBMISSION_BATCHED;
1691  if (Properties[1] & PI_EXT_QUEUE_FLAG_SUBMISSION_IMMEDIATE)
1692  UrProperties.flags |= UR_QUEUE_FLAG_SUBMISSION_IMMEDIATE;
1693 
1694  ur_queue_index_properties_t IndexProperties{};
1695  IndexProperties.stype = UR_STRUCTURE_TYPE_QUEUE_INDEX_PROPERTIES;
1696  if (Properties[2] != 0) {
1697  IndexProperties.computeIndex = Properties[3];
1698  }
1699 
1700  UrProperties.pNext = &IndexProperties;
1701 
1702  ur_context_handle_t UrContext =
1703  reinterpret_cast<ur_context_handle_t>(Context);
1704  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
1705 
1706  ur_queue_handle_t *UrQueue = reinterpret_cast<ur_queue_handle_t *>(Queue);
1707  HANDLE_ERRORS(urQueueCreate(UrContext, UrDevice, &UrProperties, UrQueue));
1708 
1709  return PI_SUCCESS;
1710 }
1711 
1713  pi_queue_properties Flags, pi_queue *Queue) {
1714  pi_queue_properties Properties[] = {PI_QUEUE_FLAGS, Flags, 0};
1715  return pi2ur::piextQueueCreate(Context, Device, Properties, Queue);
1716 }
1717 
1719  pi_native_handle NativeHandle, int32_t NativeHandleDesc, pi_context Context,
1720  pi_device Device, bool OwnNativeHandle, pi_queue_properties *Properties,
1721  pi_queue *Queue) {
1722  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
1723  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
1724  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
1725 
1726  ur_context_handle_t UrContext =
1727  reinterpret_cast<ur_context_handle_t>(Context);
1728  ur_device_handle_t UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
1729  ur_native_handle_t UrNativeHandle =
1730  reinterpret_cast<ur_native_handle_t>(NativeHandle);
1731  ur_queue_handle_t *UrQueue = reinterpret_cast<ur_queue_handle_t *>(Queue);
1732  ur_queue_native_properties_t UrNativeProperties{};
1733  UrNativeProperties.isNativeHandleOwned = OwnNativeHandle;
1734 
1735  ur_queue_properties_t UrProperties{};
1736  UrProperties.stype = UR_STRUCTURE_TYPE_QUEUE_PROPERTIES;
1737  if (Properties[1] & PI_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE)
1738  UrProperties.flags |= UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE;
1739  if (Properties[1] & PI_QUEUE_FLAG_PROFILING_ENABLE)
1740  UrProperties.flags |= UR_QUEUE_FLAG_PROFILING_ENABLE;
1741  if (Properties[1] & PI_QUEUE_FLAG_ON_DEVICE)
1742  UrProperties.flags |= UR_QUEUE_FLAG_ON_DEVICE;
1743  if (Properties[1] & PI_QUEUE_FLAG_ON_DEVICE_DEFAULT)
1744  UrProperties.flags |= UR_QUEUE_FLAG_ON_DEVICE_DEFAULT;
1745  if (Properties[1] & PI_EXT_ONEAPI_QUEUE_FLAG_DISCARD_EVENTS)
1746  UrProperties.flags |= UR_QUEUE_FLAG_DISCARD_EVENTS;
1747  if (Properties[1] & PI_EXT_ONEAPI_QUEUE_FLAG_PRIORITY_LOW)
1748  UrProperties.flags |= UR_QUEUE_FLAG_PRIORITY_LOW;
1749  if (Properties[1] & PI_EXT_ONEAPI_QUEUE_FLAG_PRIORITY_HIGH)
1750  UrProperties.flags |= UR_QUEUE_FLAG_PRIORITY_HIGH;
1751 
1752  ur_queue_native_desc_t UrNativeDesc{};
1753  UrNativeDesc.stype = UR_STRUCTURE_TYPE_QUEUE_NATIVE_DESC;
1754  UrNativeDesc.pNativeData = &NativeHandleDesc;
1755 
1756  UrProperties.pNext = &UrNativeDesc;
1757  UrNativeProperties.pNext = &UrProperties;
1758 
1759  HANDLE_ERRORS(urQueueCreateWithNativeHandle(
1760  UrNativeHandle, UrContext, UrDevice, &UrNativeProperties, UrQueue));
1761  return PI_SUCCESS;
1762 }
1763 
1765  pi_native_handle *NativeHandle,
1766  int32_t *NativeHandleDesc) {
1767 
1768  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
1769  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
1770 
1771  ur_queue_native_desc_t UrNativeDesc{};
1772  UrNativeDesc.pNativeData = NativeHandleDesc;
1773 
1774  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
1775 
1776  ur_native_handle_t UrNativeQueue{};
1777  HANDLE_ERRORS(urQueueGetNativeHandle(UrQueue, &UrNativeDesc, &UrNativeQueue));
1778 
1779  *NativeHandle = reinterpret_cast<pi_native_handle>(UrNativeQueue);
1780 
1781  return PI_SUCCESS;
1782 }
1783 
1785  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
1786 
1787  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
1788 
1789  HANDLE_ERRORS(urQueueRelease(UrQueue));
1790 
1791  return PI_SUCCESS;
1792 }
1793 
1795  // Wait until command lists attached to the command queue are executed.
1796  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
1797 
1798  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
1799 
1800  HANDLE_ERRORS(urQueueFinish(UrQueue));
1801 
1802  return PI_SUCCESS;
1803 }
1804 
1806  size_t ParamValueSize, void *ParamValue,
1807  size_t *ParamValueSizeRet) {
1808  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
1809 
1810  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
1811 
1812  ur_queue_info_t UrParamName{};
1813 
1814  switch (ParamName) {
1815  case PI_QUEUE_INFO_CONTEXT: {
1816  UrParamName = UR_QUEUE_INFO_CONTEXT;
1817  break;
1818  }
1819  case PI_QUEUE_INFO_DEVICE: {
1820  UrParamName = UR_QUEUE_INFO_DEVICE;
1821  break;
1822  }
1824  UrParamName = UR_QUEUE_INFO_DEVICE_DEFAULT;
1825  break;
1826  }
1827  case PI_QUEUE_INFO_PROPERTIES: {
1828  UrParamName = UR_QUEUE_INFO_FLAGS;
1829  break;
1830  }
1832  UrParamName = UR_QUEUE_INFO_REFERENCE_COUNT;
1833  break;
1834  }
1835  case PI_QUEUE_INFO_SIZE: {
1836  UrParamName = UR_QUEUE_INFO_SIZE;
1837  break;
1838  }
1840  UrParamName = UR_QUEUE_INFO_EMPTY;
1841  break;
1842  }
1843  default: {
1844  die("Unsupported ParamName in piQueueGetInfo");
1845  return PI_ERROR_INVALID_VALUE;
1846  }
1847  }
1848 
1849  HANDLE_ERRORS(urQueueGetInfo(UrQueue, UrParamName, ParamValueSize, ParamValue,
1850  ParamValueSizeRet));
1851 
1852  return PI_SUCCESS;
1853 }
1854 
1856 
1857  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
1858 
1859  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
1860 
1861  HANDLE_ERRORS(urQueueRetain(UrQueue));
1862 
1863  return PI_SUCCESS;
1864 }
1865 
1867 
1868  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
1869 
1870  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
1871 
1872  HANDLE_ERRORS(urQueueFlush(UrQueue));
1873 
1874  return PI_SUCCESS;
1875 }
1876 
1877 // Queue
1879 
1881 // Program
1882 
1883 inline pi_result piProgramCreate(pi_context Context, const void *ILBytes,
1884  size_t Length, pi_program *Program) {
1885 
1886  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
1887  PI_ASSERT(ILBytes && Length, PI_ERROR_INVALID_VALUE);
1888  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
1889 
1890  ur_context_handle_t UrContext =
1891  reinterpret_cast<ur_context_handle_t>(Context);
1892 
1893  ur_program_properties_t UrProperties{};
1894  ur_program_handle_t *UrProgram =
1895  reinterpret_cast<ur_program_handle_t *>(Program);
1896  HANDLE_ERRORS(urProgramCreateWithIL(UrContext, ILBytes, Length, &UrProperties,
1897  UrProgram));
1898 
1899  return PI_SUCCESS;
1900 }
1901 
1903  pi_context Context, pi_uint32 NumDevices, const pi_device *DeviceList,
1904  const size_t *Lengths, const unsigned char **Binaries,
1905  size_t NumMetadataEntries, const pi_device_binary_property *Metadata,
1906  pi_int32 *BinaryStatus, pi_program *Program) {
1907  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
1908  PI_ASSERT(DeviceList && NumDevices, PI_ERROR_INVALID_VALUE);
1909  PI_ASSERT(Binaries && Lengths, PI_ERROR_INVALID_VALUE);
1910  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
1911 
1912  if (!Binaries[0] || !Lengths[0]) {
1913  if (BinaryStatus)
1914  *BinaryStatus = PI_ERROR_INVALID_VALUE;
1915  return PI_ERROR_INVALID_VALUE;
1916  }
1917 
1918  ur_context_handle_t UrContext =
1919  reinterpret_cast<ur_context_handle_t>(Context);
1920  auto UrDevice = reinterpret_cast<ur_device_handle_t>(DeviceList[0]);
1921 
1922  ur_program_properties_t Properties = {};
1923  Properties.stype = UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES;
1924  Properties.pNext = nullptr;
1925  Properties.count = NumMetadataEntries;
1926 
1927  std::unique_ptr<ur_program_metadata_t[]> pMetadatas;
1928  if (NumMetadataEntries) {
1929  pMetadatas.reset(new ur_program_metadata_t[NumMetadataEntries]);
1930  for (unsigned i = 0; i < NumMetadataEntries; i++) {
1931  HANDLE_ERRORS(mapPIMetadataToUR(&Metadata[i], &pMetadatas[i]));
1932  }
1933 
1934  Properties.pMetadatas = pMetadatas.get();
1935  }
1936 
1937  ur_program_handle_t *UrProgram =
1938  reinterpret_cast<ur_program_handle_t *>(Program);
1939  HANDLE_ERRORS(urProgramCreateWithBinary(UrContext, UrDevice, Lengths[0],
1940  Binaries[0], &Properties, UrProgram));
1941 
1942  if (BinaryStatus)
1943  *BinaryStatus = PI_SUCCESS;
1944 
1945  return PI_SUCCESS;
1946 }
1947 
1949  size_t ParamValueSize, void *ParamValue,
1950  size_t *ParamValueSizeRet) {
1951 
1952  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
1953 
1954  ur_program_handle_t UrProgram =
1955  reinterpret_cast<ur_program_handle_t>(Program);
1956 
1957  ur_program_info_t PropName{};
1958 
1959  switch (ParamName) {
1961  PropName = UR_PROGRAM_INFO_REFERENCE_COUNT;
1962  break;
1963  }
1964  case PI_PROGRAM_INFO_CONTEXT: {
1965  PropName = UR_PROGRAM_INFO_CONTEXT;
1966  break;
1967  }
1969  PropName = UR_PROGRAM_INFO_NUM_DEVICES;
1970  break;
1971  }
1972  case PI_PROGRAM_INFO_DEVICES: {
1973  PropName = UR_PROGRAM_INFO_DEVICES;
1974  break;
1975  }
1976  case PI_PROGRAM_INFO_SOURCE: {
1977  PropName = UR_PROGRAM_INFO_SOURCE;
1978  break;
1979  }
1981  PropName = UR_PROGRAM_INFO_BINARY_SIZES;
1982  break;
1983  }
1984  case PI_PROGRAM_INFO_BINARIES: {
1985  PropName = UR_PROGRAM_INFO_BINARIES;
1986  break;
1987  }
1989  PropName = UR_PROGRAM_INFO_NUM_KERNELS;
1990  break;
1991  }
1993  PropName = UR_PROGRAM_INFO_KERNEL_NAMES;
1994  break;
1995  }
1996  default: {
1997  die("urProgramGetInfo: not implemented");
1998  }
1999  }
2000 
2001  HANDLE_ERRORS(urProgramGetInfo(UrProgram, PropName, ParamValueSize,
2002  ParamValue, ParamValueSizeRet));
2003 
2004  return PI_SUCCESS;
2005 }
2006 
2007 inline pi_result
2008 piProgramLink(pi_context Context, pi_uint32 NumDevices,
2009  const pi_device *DeviceList, const char *Options,
2010  pi_uint32 NumInputPrograms, const pi_program *InputPrograms,
2011  void (*PFnNotify)(pi_program Program, void *UserData),
2012  void *UserData, pi_program *RetProgram) {
2013 
2014  // Validate input parameters.
2015  PI_ASSERT(DeviceList, PI_ERROR_INVALID_DEVICE);
2016  PI_ASSERT(!PFnNotify && !UserData, PI_ERROR_INVALID_VALUE);
2017  if (NumInputPrograms == 0 || InputPrograms == nullptr)
2018  return PI_ERROR_INVALID_VALUE;
2019 
2020  ur_context_handle_t UrContext =
2021  reinterpret_cast<ur_context_handle_t>(Context);
2022  const ur_program_handle_t *UrInputPrograms =
2023  reinterpret_cast<const ur_program_handle_t *>(InputPrograms);
2024  ur_program_handle_t *UrProgram =
2025  reinterpret_cast<ur_program_handle_t *>(RetProgram);
2026 
2027  auto UrDevices = reinterpret_cast<ur_device_handle_t *>(
2028  const_cast<pi_device *>(DeviceList));
2029 
2030  auto urResult =
2031  urProgramLinkExp(UrContext, NumDevices, UrDevices, NumInputPrograms,
2032  UrInputPrograms, Options, UrProgram);
2033  if (urResult == UR_RESULT_ERROR_UNSUPPORTED_FEATURE) {
2034  urResult = urProgramLink(UrContext, NumInputPrograms, UrInputPrograms,
2035  Options, UrProgram);
2036  }
2037  return ur2piResult(urResult);
2038 }
2039 
2041  pi_program Program, pi_uint32 NumDevices, const pi_device *DeviceList,
2042  const char *Options, pi_uint32 NumInputHeaders,
2043  const pi_program *InputHeaders, const char **HeaderIncludeNames,
2044  void (*PFnNotify)(pi_program Program, void *UserData), void *UserData) {
2045 
2046  std::ignore = NumInputHeaders;
2047  std::ignore = InputHeaders;
2048  std::ignore = HeaderIncludeNames;
2049 
2050  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2051 
2052  if ((NumDevices && !DeviceList) || (!NumDevices && DeviceList))
2053  return PI_ERROR_INVALID_VALUE;
2054 
2055  // These aren't supported.
2056  PI_ASSERT(!PFnNotify && !UserData, PI_ERROR_INVALID_VALUE);
2057 
2058  ur_program_handle_t UrProgram =
2059  reinterpret_cast<ur_program_handle_t>(Program);
2060 
2061  ur_program_info_t PropName = UR_PROGRAM_INFO_CONTEXT;
2062  ur_context_handle_t UrContext{};
2063  HANDLE_ERRORS(urProgramGetInfo(UrProgram, PropName, sizeof(&UrContext),
2064  &UrContext, nullptr));
2065 
2066  auto UrDevices = reinterpret_cast<ur_device_handle_t *>(
2067  const_cast<pi_device *>(DeviceList));
2068 
2069  auto urResult =
2070  urProgramCompileExp(UrProgram, NumDevices, UrDevices, Options);
2071  if (urResult == UR_RESULT_ERROR_UNSUPPORTED_FEATURE) {
2072  urResult = urProgramCompile(UrContext, UrProgram, Options);
2073  }
2074  return ur2piResult(urResult);
2075 }
2076 
2077 inline pi_result
2079  const pi_device *DeviceList, const char *Options,
2080  void (*PFnNotify)(pi_program Program, void *UserData),
2081  void *UserData) {
2082  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2083  if ((NumDevices && !DeviceList) || (!NumDevices && DeviceList)) {
2084  return PI_ERROR_INVALID_VALUE;
2085  }
2086 
2087  // These aren't supported.
2088  PI_ASSERT(!PFnNotify && !UserData, PI_ERROR_INVALID_VALUE);
2089 
2090  ur_program_handle_t UrProgram =
2091  reinterpret_cast<ur_program_handle_t>(Program);
2092  ur_program_info_t PropName = UR_PROGRAM_INFO_CONTEXT;
2093  ur_context_handle_t UrContext{};
2094  HANDLE_ERRORS(urProgramGetInfo(UrProgram, PropName, sizeof(&UrContext),
2095  &UrContext, nullptr));
2096 
2097  auto UrDevices = reinterpret_cast<ur_device_handle_t *>(
2098  const_cast<pi_device *>(DeviceList));
2099 
2100  auto urResult = urProgramBuildExp(UrProgram, NumDevices, UrDevices, Options);
2101  if (urResult == UR_RESULT_ERROR_UNSUPPORTED_FEATURE) {
2102  urResult = urProgramBuild(UrContext, UrProgram, Options);
2103  }
2104  return ur2piResult(urResult);
2105 }
2106 
2108  pi_uint32 SpecID,
2109  size_t Size,
2110  const void *SpecValue) {
2111  ur_program_handle_t UrProgram =
2112  reinterpret_cast<ur_program_handle_t>(Program);
2113  uint32_t Count = 1;
2114  ur_specialization_constant_info_t SpecConstant{};
2115  SpecConstant.id = SpecID;
2116  SpecConstant.size = Size;
2117  SpecConstant.pValue = SpecValue;
2118  HANDLE_ERRORS(
2119  urProgramSetSpecializationConstants(UrProgram, Count, &SpecConstant));
2120 
2121  return PI_SUCCESS;
2122 }
2123 
2124 inline pi_result piKernelCreate(pi_program Program, const char *KernelName,
2125  pi_kernel *RetKernel) {
2126  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2127  PI_ASSERT(RetKernel, PI_ERROR_INVALID_VALUE);
2128  PI_ASSERT(KernelName, PI_ERROR_INVALID_VALUE);
2129 
2130  ur_program_handle_t UrProgram =
2131  reinterpret_cast<ur_program_handle_t>(Program);
2132  ur_kernel_handle_t *UrKernel =
2133  reinterpret_cast<ur_kernel_handle_t *>(RetKernel);
2134 
2135  HANDLE_ERRORS(urKernelCreate(UrProgram, KernelName, UrKernel));
2136 
2137  return PI_SUCCESS;
2138 }
2139 
2140 inline pi_result
2141 piEnqueueMemImageFill(pi_queue Queue, pi_mem Image, const void *FillColor,
2142  const size_t *Origin, const size_t *Region,
2143  pi_uint32 NumEventsInWaitList,
2144  const pi_event *EventsWaitList, pi_event *Event) {
2145 
2146  std::ignore = Image;
2147  std::ignore = FillColor;
2148  std::ignore = Origin;
2149  std::ignore = Region;
2150  std::ignore = NumEventsInWaitList;
2151  std::ignore = EventsWaitList;
2152  std::ignore = Event;
2153 
2154  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
2155 
2156  die("piEnqueueMemImageFill: not implemented");
2157  return PI_SUCCESS;
2158 }
2159 
2161  pi_program Program,
2162  const char *FunctionName,
2163  pi_uint64 *FunctionPointerRet) {
2164 
2165  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2166 
2167  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
2168 
2169  ur_program_handle_t UrProgram =
2170  reinterpret_cast<ur_program_handle_t>(Program);
2171 
2172  void **FunctionPointer = reinterpret_cast<void **>(FunctionPointerRet);
2173 
2174  HANDLE_ERRORS(urProgramGetFunctionPointer(UrDevice, UrProgram, FunctionName,
2175  FunctionPointer));
2176  return PI_SUCCESS;
2177 }
2178 
2180  pi_device Device, pi_program Program, const char *GlobalVariableName,
2181  size_t *GlobalVariableSize, void **GlobalVariablePointerRet) {
2182  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2183 
2184  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
2185 
2186  ur_program_handle_t UrProgram =
2187  reinterpret_cast<ur_program_handle_t>(Program);
2188 
2189  HANDLE_ERRORS(urProgramGetGlobalVariablePointer(
2190  UrDevice, UrProgram, GlobalVariableName, GlobalVariableSize,
2191  GlobalVariablePointerRet));
2192  return PI_SUCCESS;
2193 }
2194 
2195 // Special version of piKernelSetArg to accept pi_mem.
2196 inline pi_result
2198  const pi_mem_obj_property *ArgProperties,
2199  const pi_mem *ArgValue) {
2200 
2201  // TODO: the better way would probably be to add a new PI API for
2202  // extracting native PI object from PI handle, and have SYCL
2203  // RT pass that directly to the regular piKernelSetArg (and
2204  // then remove this piextKernelSetArgMemObj).
2205 
2206  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2207 
2208  ur_mem_handle_t UrMemory{};
2209  if (ArgValue)
2210  UrMemory = reinterpret_cast<ur_mem_handle_t>(*ArgValue);
2211 
2212  // We don't yet know the device where this kernel will next be run on.
2213  // Thus we can't know the actual memory allocation that needs to be used.
2214  // Remember the memory object being used as an argument for this kernel
2215  // to process it later when the device is known (at the kernel enqueue).
2216  //
2217  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2218  // the only applicable type, just ignore anything else
2219  if (ArgProperties && ArgProperties->type == PI_KERNEL_ARG_MEM_OBJ_ACCESS) {
2220  // following structure layout checks to be replaced with
2221  // std::is_layout_compatible after move to C++20
2222  static_assert(sizeof(pi_mem_obj_property) ==
2223  sizeof(ur_kernel_arg_mem_obj_properties_t));
2224  static_assert(sizeof(pi_mem_obj_property::type) ==
2225  sizeof(ur_kernel_arg_mem_obj_properties_t::stype));
2226  static_assert(sizeof(pi_mem_obj_property::pNext) ==
2227  sizeof(ur_kernel_arg_mem_obj_properties_t::pNext));
2228  static_assert(sizeof(pi_mem_obj_property::mem_access) ==
2229  sizeof(ur_kernel_arg_mem_obj_properties_t::memoryAccess));
2230 
2231  static_assert(uint32_t(PI_ACCESS_READ_WRITE) ==
2232  uint32_t(UR_MEM_FLAG_READ_WRITE));
2233  static_assert(uint32_t(PI_ACCESS_READ_ONLY) ==
2234  uint32_t(UR_MEM_FLAG_READ_ONLY));
2235  static_assert(uint32_t(PI_ACCESS_WRITE_ONLY) ==
2236  uint32_t(UR_MEM_FLAG_WRITE_ONLY));
2237  static_assert(uint32_t(PI_KERNEL_ARG_MEM_OBJ_ACCESS) ==
2238  uint32_t(UR_STRUCTURE_TYPE_KERNEL_ARG_MEM_OBJ_PROPERTIES));
2239 
2240  const ur_kernel_arg_mem_obj_properties_t *UrMemProperties =
2241  reinterpret_cast<const ur_kernel_arg_mem_obj_properties_t *>(
2242  ArgProperties);
2243  HANDLE_ERRORS(
2244  urKernelSetArgMemObj(UrKernel, ArgIndex, UrMemProperties, UrMemory));
2245  } else {
2246  HANDLE_ERRORS(urKernelSetArgMemObj(UrKernel, ArgIndex, nullptr, UrMemory));
2247  }
2248 
2249  return PI_SUCCESS;
2250 }
2251 
2253  size_t ArgSize, const void *ArgValue) {
2254 
2255  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2256 
2257  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2258 
2259  if (ArgValue) {
2260  HANDLE_ERRORS(
2261  urKernelSetArgValue(UrKernel, ArgIndex, ArgSize, nullptr, ArgValue));
2262  } else {
2263  HANDLE_ERRORS(urKernelSetArgLocal(UrKernel, ArgIndex, ArgSize, nullptr));
2264  }
2265  return PI_SUCCESS;
2266 }
2267 
2269  size_t ArgSize, const void *ArgValue) {
2270  std::ignore = ArgSize;
2271  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2272  HANDLE_ERRORS(urKernelSetArgPointer(UrKernel, ArgIndex, nullptr, ArgValue));
2273 
2274  return PI_SUCCESS;
2275 }
2276 
2277 inline pi_result
2279  pi_context Context, pi_program Program,
2280  bool OwnNativeHandle, pi_kernel *Kernel) {
2281  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
2282  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2283 
2284  ur_native_handle_t UrNativeKernel =
2285  reinterpret_cast<ur_native_handle_t>(NativeHandle);
2286  ur_context_handle_t UrContext =
2287  reinterpret_cast<ur_context_handle_t>(Context);
2288  ur_program_handle_t UrProgram =
2289  reinterpret_cast<ur_program_handle_t>(Program);
2290  ur_kernel_handle_t *UrKernel = reinterpret_cast<ur_kernel_handle_t *>(Kernel);
2291  ur_kernel_native_properties_t Properties{};
2292  Properties.isNativeHandleOwned = OwnNativeHandle;
2293  HANDLE_ERRORS(urKernelCreateWithNativeHandle(
2294  UrNativeKernel, UrContext, UrProgram, &Properties, UrKernel));
2295 
2296  return PI_SUCCESS;
2297 }
2298 
2300  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2301 
2302  ur_program_handle_t UrProgram =
2303  reinterpret_cast<ur_program_handle_t>(Program);
2304  HANDLE_ERRORS(
2305  urProgramRetain(reinterpret_cast<ur_program_handle_t>(UrProgram)));
2306 
2307  return PI_SUCCESS;
2308 }
2309 
2311  pi_kernel_exec_info ParamName,
2312  size_t ParamValueSize,
2313  const void *ParamValue) {
2314 
2315  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2316  PI_ASSERT(ParamValue, PI_ERROR_INVALID_VALUE);
2317 
2318  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2319  ur_kernel_exec_info_t PropName{};
2320  uint64_t PropValue{};
2321  switch (ParamName) {
2322  case PI_USM_INDIRECT_ACCESS: {
2323  PropName = UR_KERNEL_EXEC_INFO_USM_INDIRECT_ACCESS;
2324  PropValue = *(static_cast<uint64_t *>(const_cast<void *>(ParamValue)));
2325  break;
2326  }
2327  case PI_USM_PTRS: {
2328  PropName = UR_KERNEL_EXEC_INFO_USM_PTRS;
2329  break;
2330  }
2332  PropName = UR_KERNEL_EXEC_INFO_CACHE_CONFIG;
2333  auto Param = (*(static_cast<const pi_kernel_cache_config *>(ParamValue)));
2335  PropValue = static_cast<uint64_t>(UR_KERNEL_CACHE_CONFIG_LARGE_SLM);
2336  } else if (Param == PI_EXT_KERNEL_EXEC_INFO_CACHE_LARGE_DATA) {
2337  PropValue = static_cast<uint64_t>(UR_KERNEL_CACHE_CONFIG_LARGE_DATA);
2338  break;
2339  } else if (Param == PI_EXT_KERNEL_EXEC_INFO_CACHE_DEFAULT) {
2340  PropValue = static_cast<uint64_t>(UR_KERNEL_CACHE_CONFIG_DEFAULT);
2341  } else {
2342  die("piKernelSetExecInfo: unsupported ParamValue\n");
2343  }
2344  break;
2345  }
2346  default:
2347  die("piKernelSetExecInfo: unsupported ParamName\n");
2348  }
2349  HANDLE_ERRORS(urKernelSetExecInfo(UrKernel, PropName, ParamValueSize, nullptr,
2350  &PropValue));
2351 
2352  return PI_SUCCESS;
2353 }
2354 
2356  pi_native_handle *NativeHandle) {
2357  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2358  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
2359 
2360  ur_program_handle_t UrProgram =
2361  reinterpret_cast<ur_program_handle_t>(Program);
2362  ur_native_handle_t NativeProgram{};
2363  HANDLE_ERRORS(urProgramGetNativeHandle(UrProgram, &NativeProgram));
2364 
2365  *NativeHandle = reinterpret_cast<pi_native_handle>(NativeProgram);
2366 
2367  return PI_SUCCESS;
2368 }
2369 
2370 inline pi_result
2372  pi_context Context, bool OwnNativeHandle,
2373  pi_program *Program) {
2374  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2375  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
2376  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
2377 
2378  ur_native_handle_t NativeProgram =
2379  reinterpret_cast<ur_native_handle_t>(NativeHandle);
2380  ur_context_handle_t UrContext =
2381  reinterpret_cast<ur_context_handle_t>(Context);
2382  ur_program_handle_t *UrProgram =
2383  reinterpret_cast<ur_program_handle_t *>(Program);
2384  ur_program_native_properties_t UrProperties{};
2385  UrProperties.isNativeHandleOwned = OwnNativeHandle;
2386  HANDLE_ERRORS(urProgramCreateWithNativeHandle(NativeProgram, UrContext,
2387  &UrProperties, UrProgram));
2388  return PI_SUCCESS;
2389 }
2390 
2392  size_t ParamValueSize, void *ParamValue,
2393  size_t *ParamValueSizeRet) {
2394  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2395 
2396  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2397  ur_kernel_info_t UrParamName{};
2398  switch (ParamName) {
2400  UrParamName = UR_KERNEL_INFO_FUNCTION_NAME;
2401  break;
2402  }
2403  case PI_KERNEL_INFO_NUM_ARGS: {
2404  size_t NumArgs = 0;
2405  HANDLE_ERRORS(urKernelGetInfo(UrKernel, UR_KERNEL_INFO_NUM_ARGS,
2406  sizeof(NumArgs), &NumArgs, nullptr));
2407  if (ParamValueSizeRet) {
2408  *ParamValueSizeRet = sizeof(uint32_t);
2409  }
2410  if (ParamValue) {
2411  if (ParamValueSize != sizeof(uint32_t))
2412  return PI_ERROR_INVALID_BUFFER_SIZE;
2413  *static_cast<uint32_t *>(ParamValue) = static_cast<uint32_t>(NumArgs);
2414  }
2415  return PI_SUCCESS;
2416  }
2418  UrParamName = UR_KERNEL_INFO_REFERENCE_COUNT;
2419  break;
2420  }
2421  case PI_KERNEL_INFO_CONTEXT: {
2422  UrParamName = UR_KERNEL_INFO_CONTEXT;
2423  break;
2424  }
2425  case PI_KERNEL_INFO_PROGRAM: {
2426  UrParamName = UR_KERNEL_INFO_PROGRAM;
2427  break;
2428  }
2430  UrParamName = UR_KERNEL_INFO_ATTRIBUTES;
2431  break;
2432  }
2433  default:
2434  return PI_ERROR_INVALID_PROPERTY;
2435  }
2436 
2437  HANDLE_ERRORS(urKernelGetInfo(UrKernel, UrParamName, ParamValueSize,
2438  ParamValue, ParamValueSizeRet));
2439 
2440  return PI_SUCCESS;
2441 }
2442 
2444  pi_kernel_group_info ParamName,
2445  size_t ParamValueSize, void *ParamValue,
2446  size_t *ParamValueSizeRet) {
2447  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2448  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
2449 
2450  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2451  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
2452 
2453  ur_kernel_group_info_t UrParamName{};
2454  switch (ParamName) {
2456  UrParamName = UR_KERNEL_GROUP_INFO_GLOBAL_WORK_SIZE;
2457  break;
2458  }
2460  UrParamName = UR_KERNEL_GROUP_INFO_WORK_GROUP_SIZE;
2461  break;
2462  }
2464  UrParamName = UR_KERNEL_GROUP_INFO_COMPILE_WORK_GROUP_SIZE;
2465  break;
2466  }
2468  UrParamName = UR_KERNEL_GROUP_INFO_LOCAL_MEM_SIZE;
2469  break;
2470  }
2472  UrParamName = UR_KERNEL_GROUP_INFO_PREFERRED_WORK_GROUP_SIZE_MULTIPLE;
2473  break;
2474  }
2476  UrParamName = UR_KERNEL_GROUP_INFO_PRIVATE_MEM_SIZE;
2477  break;
2478  }
2479  // The number of registers used by the compiled kernel (device specific)
2481  HANDLE_ERRORS(urKernelGetInfo(UrKernel, UR_KERNEL_INFO_NUM_REGS,
2482  ParamValueSize, ParamValue,
2483  ParamValueSizeRet));
2484  return PI_SUCCESS;
2485  }
2486  default: {
2487  die("Unknown ParamName in piKernelGetGroupInfo");
2488  return PI_ERROR_INVALID_VALUE;
2489  }
2490  }
2491 
2492  HANDLE_ERRORS(urKernelGetGroupInfo(UrKernel, UrDevice, UrParamName,
2493  ParamValueSize, ParamValue,
2494  ParamValueSizeRet));
2495 
2496  return PI_SUCCESS;
2497 }
2498 
2500 
2501  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2502 
2503  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2504 
2505  HANDLE_ERRORS(urKernelRetain(UrKernel));
2506 
2507  return PI_SUCCESS;
2508 }
2509 
2511 
2512  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2513 
2514  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2515 
2516  HANDLE_ERRORS(urKernelRelease(UrKernel));
2517 
2518  return PI_SUCCESS;
2519 }
2520 
2522 
2523  PI_ASSERT(Program, PI_ERROR_INVALID_PROGRAM);
2524 
2525  ur_program_handle_t UrProgram =
2526  reinterpret_cast<ur_program_handle_t>(Program);
2527 
2528  HANDLE_ERRORS(urProgramRelease(UrProgram));
2529 
2530  return PI_SUCCESS;
2531 }
2532 
2534  size_t, const void *ArgValue) {
2535  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2536  HANDLE_ERRORS(urKernelSetArgPointer(UrKernel, ArgIndex, nullptr, ArgValue));
2537 
2538  return PI_SUCCESS;
2539 }
2540 
2542  pi_kernel Kernel, pi_device Device, pi_kernel_sub_group_info ParamName,
2543  size_t InputValueSize, const void *InputValue, size_t ParamValueSize,
2544  void *ParamValue, size_t *ParamValueSizeRet) {
2545 
2546  std::ignore = InputValueSize;
2547  std::ignore = InputValue;
2548 
2549  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2550  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
2551 
2552  ur_kernel_sub_group_info_t PropName{};
2553  switch (ParamName) {
2555  PropName = UR_KERNEL_SUB_GROUP_INFO_MAX_SUB_GROUP_SIZE;
2556  break;
2557  }
2559  PropName = UR_KERNEL_SUB_GROUP_INFO_MAX_NUM_SUB_GROUPS;
2560  break;
2561  }
2563  PropName = UR_KERNEL_SUB_GROUP_INFO_COMPILE_NUM_SUB_GROUPS;
2564  break;
2565  }
2567  PropName = UR_KERNEL_SUB_GROUP_INFO_SUB_GROUP_SIZE_INTEL;
2568  break;
2569  }
2570  }
2571  HANDLE_ERRORS(urKernelGetSubGroupInfo(UrKernel, UrDevice, PropName,
2572  ParamValueSize, ParamValue,
2573  ParamValueSizeRet));
2574 
2575  return PI_SUCCESS;
2576 }
2577 
2579  pi_program_build_info ParamName,
2580  size_t ParamValueSize, void *ParamValue,
2581  size_t *ParamValueSizeRet) {
2582 
2583  ur_program_handle_t UrProgram =
2584  reinterpret_cast<ur_program_handle_t>(Program);
2585  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
2586 
2587  ur_program_build_info_t PropName{};
2588  switch (ParamName) {
2590  PropName = UR_PROGRAM_BUILD_INFO_STATUS;
2591  break;
2592  }
2594  PropName = UR_PROGRAM_BUILD_INFO_OPTIONS;
2595  break;
2596  }
2598  PropName = UR_PROGRAM_BUILD_INFO_LOG;
2599  break;
2600  }
2602  PropName = UR_PROGRAM_BUILD_INFO_BINARY_TYPE;
2603  break;
2604  }
2605  default: {
2606  die("piProgramGetBuildInfo: not implemented");
2607  }
2608  }
2609 
2610  size_t SizeInOut = ParamValueSize;
2611  HANDLE_ERRORS(urProgramGetBuildInfo(UrProgram, UrDevice, PropName,
2612  ParamValueSize, ParamValue,
2613  ParamValueSizeRet));
2614  ur2piProgramBuildInfoValue(PropName, ParamValueSize, &SizeInOut, ParamValue);
2615  return PI_SUCCESS;
2616 }
2617 
2619  pi_native_handle *NativeHandle) {
2620  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2621  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
2622 
2623  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2624  ur_native_handle_t NativeKernel{};
2625  HANDLE_ERRORS(urKernelGetNativeHandle(UrKernel, &NativeKernel));
2626 
2627  *NativeHandle = reinterpret_cast<pi_native_handle>(NativeKernel);
2628 
2629  return PI_SUCCESS;
2630 }
2631 
2633  pi_kernel Kernel, size_t LocalWorkSize, size_t DynamicSharedMemorySize,
2634  pi_uint32 *GroupCountRet) {
2635  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
2636  PI_ASSERT(GroupCountRet, PI_ERROR_INVALID_VALUE);
2637 
2638  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
2639  HANDLE_ERRORS(urKernelSuggestMaxCooperativeGroupCountExp(
2640  UrKernel, LocalWorkSize, DynamicSharedMemorySize, GroupCountRet));
2641 
2642  return PI_SUCCESS;
2643 }
2644 
2659  pi_queue Queue, pi_program Program, const char *Name, pi_bool BlockingWrite,
2660  size_t Count, size_t Offset, const void *Src, pi_uint32 NumEventsInWaitList,
2661  const pi_event *EventsWaitList, pi_event *OutEvent) {
2662  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
2663 
2664  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
2665  ur_program_handle_t UrProgram =
2666  reinterpret_cast<ur_program_handle_t>(Program);
2667  const ur_event_handle_t *UrEventsWaitList =
2668  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
2669  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
2670  HANDLE_ERRORS(urEnqueueDeviceGlobalVariableWrite(
2671  UrQueue, UrProgram, Name, BlockingWrite, Count, Offset, Src,
2672  NumEventsInWaitList, UrEventsWaitList, UREvent));
2673 
2674  return PI_SUCCESS;
2675 }
2676 
2691  pi_queue Queue, pi_program Program, const char *Name, pi_bool BlockingRead,
2692  size_t Count, size_t Offset, void *Dst, pi_uint32 NumEventsInWaitList,
2693  const pi_event *EventsWaitList, pi_event *OutEvent) {
2694 
2695  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
2696 
2697  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
2698  ur_program_handle_t UrProgram =
2699  reinterpret_cast<ur_program_handle_t>(Program);
2700  const ur_event_handle_t *UrEventsWaitList =
2701  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
2702 
2703  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
2704 
2705  HANDLE_ERRORS(urEnqueueDeviceGlobalVariableRead(
2706  UrQueue, UrProgram, Name, BlockingRead, Count, Offset, Dst,
2707  NumEventsInWaitList, UrEventsWaitList, UREvent));
2708 
2709  return PI_SUCCESS;
2710 }
2711 
2712 // Program
2714 
2716 // Memory
2718  size_t Size, void *HostPtr, pi_mem *RetMem,
2719  const pi_mem_properties *properties) {
2720 
2721  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
2722  PI_ASSERT(RetMem, PI_ERROR_INVALID_VALUE);
2723 
2724  ur_context_handle_t UrContext =
2725  reinterpret_cast<ur_context_handle_t>(Context);
2726 
2727  ur_mem_flags_t UrBufferFlags{};
2728  if (Flags & PI_MEM_FLAGS_ACCESS_RW) {
2729  UrBufferFlags |= UR_MEM_FLAG_READ_WRITE;
2730  }
2731  if (Flags & PI_MEM_ACCESS_READ_ONLY) {
2732  UrBufferFlags |= UR_MEM_FLAG_READ_ONLY;
2733  }
2734  if (Flags & PI_MEM_FLAGS_HOST_PTR_USE) {
2735  UrBufferFlags |= UR_MEM_FLAG_USE_HOST_POINTER;
2736  }
2737  if (Flags & PI_MEM_FLAGS_HOST_PTR_COPY) {
2738  UrBufferFlags |= UR_MEM_FLAG_ALLOC_COPY_HOST_POINTER;
2739  }
2740  if (Flags & PI_MEM_FLAGS_HOST_PTR_ALLOC) {
2741  UrBufferFlags |= UR_MEM_FLAG_ALLOC_HOST_POINTER;
2742  }
2743 
2744  ur_buffer_properties_t UrProps{};
2745  UrProps.stype = UR_STRUCTURE_TYPE_BUFFER_PROPERTIES;
2746  UrProps.pHost = HostPtr;
2747 
2748  ur_buffer_channel_properties_t bufferChannelProperties{};
2749  bufferChannelProperties.stype = UR_STRUCTURE_TYPE_BUFFER_CHANNEL_PROPERTIES;
2750  ur_buffer_alloc_location_properties_t bufferLocationProperties{};
2751  bufferLocationProperties.stype =
2752  UR_STRUCTURE_TYPE_BUFFER_ALLOC_LOCATION_PROPERTIES;
2753  if (properties != nullptr) {
2754  bool bufferLocationPropertySet = false;
2755  bool bufferMemChannelPropertySet = false;
2756  uint64_t allocBufferLocation = 0;
2757  uint32_t allocBufferMemChannel = 0;
2758  // pi mem properties must ended by 0
2759  size_t I = 0;
2760  while (properties[I] != 0) {
2761  if (properties[I] == PI_MEM_PROPERTIES_ALLOC_BUFFER_LOCATION) {
2762  allocBufferLocation = properties[I + 1];
2763  bufferLocationPropertySet = true;
2764  } else if (properties[I] == PI_MEM_PROPERTIES_CHANNEL) {
2765  allocBufferMemChannel = properties[I + 1];
2766  bufferMemChannelPropertySet = true;
2767  }
2768  I += 2;
2769  }
2770  void *extensionProperties = nullptr;
2771  if (bufferLocationPropertySet) {
2772  bufferLocationProperties.location = allocBufferLocation;
2773  extensionProperties = &bufferLocationProperties;
2774  }
2775  if (bufferMemChannelPropertySet) {
2776  bufferChannelProperties.channel = allocBufferMemChannel;
2777  extensionProperties = &bufferChannelProperties;
2778  }
2779  if (bufferLocationPropertySet && bufferMemChannelPropertySet) {
2780  bufferLocationProperties.pNext = &bufferChannelProperties;
2781  extensionProperties = &bufferLocationProperties;
2782  }
2783  UrProps.pNext = extensionProperties;
2784  }
2785  ur_mem_handle_t *UrBuffer = reinterpret_cast<ur_mem_handle_t *>(RetMem);
2786  HANDLE_ERRORS(
2787  urMemBufferCreate(UrContext, UrBufferFlags, Size, &UrProps, UrBuffer));
2788 
2789  return PI_SUCCESS;
2790 }
2791 
2792 inline pi_result piextUSMHostAlloc(void **ResultPtr, pi_context Context,
2793  pi_usm_mem_properties *Properties,
2794  size_t Size, pi_uint32 Alignment) {
2795  ur_usm_desc_t USMDesc{};
2796  USMDesc.align = Alignment;
2797 
2798  ur_usm_alloc_location_desc_t UsmLocationDesc{};
2799  UsmLocationDesc.stype = UR_STRUCTURE_TYPE_USM_ALLOC_LOCATION_DESC;
2800 
2801  if (Properties) {
2802  uint32_t Next = 0;
2803  while (Properties[Next]) {
2804  if (Properties[Next] == PI_MEM_USM_ALLOC_BUFFER_LOCATION) {
2805  UsmLocationDesc.location = static_cast<uint32_t>(Properties[Next + 1]);
2806  USMDesc.pNext = &UsmLocationDesc;
2807  } else {
2808  return PI_ERROR_INVALID_VALUE;
2809  }
2810  Next += 2;
2811  }
2812  }
2813 
2814  ur_context_handle_t UrContext =
2815  reinterpret_cast<ur_context_handle_t>(Context);
2816 
2817  ur_usm_pool_handle_t Pool{};
2818  HANDLE_ERRORS(urUSMHostAlloc(UrContext, &USMDesc, Pool, Size, ResultPtr));
2819  return PI_SUCCESS;
2820 }
2821 
2823  size_t ParamValueSize, void *ParamValue,
2824  size_t *ParamValueSizeRet) {
2825  PI_ASSERT(Mem, PI_ERROR_INVALID_VALUE);
2826  // piMemImageGetInfo must be used for images
2827 
2828  ur_mem_handle_t UrMemory = reinterpret_cast<ur_mem_handle_t>(Mem);
2829  ur_mem_info_t MemInfoType{};
2830  switch (ParamName) {
2831  case PI_MEM_CONTEXT: {
2832  MemInfoType = UR_MEM_INFO_CONTEXT;
2833  break;
2834  }
2835  case PI_MEM_SIZE: {
2836  MemInfoType = UR_MEM_INFO_SIZE;
2837  break;
2838  }
2839  default: {
2840  die("piMemGetInfo: unsuppported ParamName.");
2841  }
2842  }
2843  HANDLE_ERRORS(urMemGetInfo(UrMemory, MemInfoType, ParamValueSize, ParamValue,
2844  ParamValueSizeRet));
2845  return PI_SUCCESS;
2846 }
2847 
2848 static void pi2urImageDesc(const pi_image_format *ImageFormat,
2849  const pi_image_desc *ImageDesc,
2850  ur_image_format_t *UrFormat,
2851  ur_image_desc_t *UrDesc) {
2852 
2853  switch (ImageFormat->image_channel_data_type) {
2854 #define PI_TO_UR_MAP_IMAGE_CHANNEL_TYPE(FROM, TO) \
2855  case FROM: { \
2856  UrFormat->channelType = TO; \
2857  break; \
2858  }
2860  UR_IMAGE_CHANNEL_TYPE_SNORM_INT8)
2862  UR_IMAGE_CHANNEL_TYPE_SNORM_INT16)
2864  UR_IMAGE_CHANNEL_TYPE_UNORM_INT8)
2866  UR_IMAGE_CHANNEL_TYPE_UNORM_INT16)
2868  UR_IMAGE_CHANNEL_TYPE_UNORM_SHORT_565)
2870  UR_IMAGE_CHANNEL_TYPE_UNORM_SHORT_555)
2872  UR_IMAGE_CHANNEL_TYPE_INT_101010)
2874  UR_IMAGE_CHANNEL_TYPE_SIGNED_INT8)
2876  UR_IMAGE_CHANNEL_TYPE_SIGNED_INT16)
2878  UR_IMAGE_CHANNEL_TYPE_SIGNED_INT32)
2880  UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8)
2882  UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16)
2884  UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32)
2886  UR_IMAGE_CHANNEL_TYPE_HALF_FLOAT)
2888  UR_IMAGE_CHANNEL_TYPE_FLOAT)
2889 #undef PI_TO_UR_MAP_IMAGE_CHANNEL_TYPE
2890  default: {
2891  die("piMemImageCreate: unsuppported image_channel_data_type.");
2892  }
2893  }
2894  switch (ImageFormat->image_channel_order) {
2895 #define PI_TO_UR_MAP_IMAGE_CHANNEL_ORDER(FROM, TO) \
2896  case FROM: { \
2897  UrFormat->channelOrder = TO; \
2898  break; \
2899  }
2901  UR_IMAGE_CHANNEL_ORDER_A)
2903  UR_IMAGE_CHANNEL_ORDER_R)
2905  UR_IMAGE_CHANNEL_ORDER_RG)
2907  UR_IMAGE_CHANNEL_ORDER_RA)
2909  UR_IMAGE_CHANNEL_ORDER_RGB)
2911  UR_IMAGE_CHANNEL_ORDER_RGBA)
2913  UR_IMAGE_CHANNEL_ORDER_BGRA)
2915  UR_IMAGE_CHANNEL_ORDER_ARGB)
2917  UR_IMAGE_CHANNEL_ORDER_ABGR)
2919  UR_IMAGE_CHANNEL_ORDER_INTENSITY)
2921  UR_IMAGE_CHANNEL_ORDER_LUMINANCE)
2923  UR_IMAGE_CHANNEL_ORDER_RX)
2925  UR_IMAGE_CHANNEL_ORDER_RGX)
2927  UR_IMAGE_CHANNEL_ORDER_RGBX)
2929  UR_IMAGE_CHANNEL_ORDER_SRGBA)
2930 #undef PI_TO_UR_MAP_IMAGE_CHANNEL_ORDER
2931  default: {
2932  die("piMemImageCreate: unsuppported image_channel_data_type.");
2933  }
2934  }
2935 
2936  UrDesc->stype = UR_STRUCTURE_TYPE_IMAGE_DESC;
2937  UrDesc->arraySize = ImageDesc->image_array_size;
2938  UrDesc->depth = ImageDesc->image_depth;
2939  UrDesc->height = ImageDesc->image_height;
2940  UrDesc->numMipLevel = ImageDesc->num_mip_levels;
2941  UrDesc->numSamples = ImageDesc->num_samples;
2942  UrDesc->rowPitch = ImageDesc->image_row_pitch;
2943  UrDesc->slicePitch = ImageDesc->image_slice_pitch;
2944  switch (ImageDesc->image_type) {
2945 #define PI_TO_UR_MAP_IMAGE_TYPE(FROM, TO) \
2946  case FROM: { \
2947  UrDesc->type = TO; \
2948  break; \
2949  }
2950  PI_TO_UR_MAP_IMAGE_TYPE(PI_MEM_TYPE_BUFFER, UR_MEM_TYPE_BUFFER)
2951  PI_TO_UR_MAP_IMAGE_TYPE(PI_MEM_TYPE_IMAGE2D, UR_MEM_TYPE_IMAGE2D)
2952  PI_TO_UR_MAP_IMAGE_TYPE(PI_MEM_TYPE_IMAGE3D, UR_MEM_TYPE_IMAGE3D)
2954  UR_MEM_TYPE_IMAGE2D_ARRAY)
2955  PI_TO_UR_MAP_IMAGE_TYPE(PI_MEM_TYPE_IMAGE1D, UR_MEM_TYPE_IMAGE1D)
2957  UR_MEM_TYPE_IMAGE1D_ARRAY)
2959  UR_MEM_TYPE_IMAGE1D_BUFFER)
2961  UR_MEM_TYPE_IMAGE_CUBEMAP_EXP)
2962 #undef PI_TO_UR_MAP_IMAGE_TYPE
2963  default: {
2964  die("piMemImageCreate: unsuppported image_type.");
2965  }
2966  }
2967  UrDesc->width = ImageDesc->image_width;
2968  UrDesc->arraySize = ImageDesc->image_array_size;
2969  UrDesc->arraySize = ImageDesc->image_array_size;
2970 }
2971 
2972 static void ur2piImageFormat(const ur_image_format_t *UrFormat,
2973  pi_image_format *PiFormat) {
2974  switch (UrFormat->channelOrder) {
2975 #define UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(FROM, TO) \
2976  case FROM: { \
2977  PiFormat->image_channel_order = TO; \
2978  break; \
2979  }
2980  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_A,
2982  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_R,
2984  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_RG,
2986  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_RA,
2988  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_RGB,
2990  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_RGBA,
2992  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_BGRA,
2994  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_ARGB,
2996  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_ABGR,
2998  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_INTENSITY,
3000  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_LUMINANCE,
3002  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_RX,
3004  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_RGX,
3006  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_RGBX,
3008  UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(UR_IMAGE_CHANNEL_ORDER_SRGBA,
3010 #undef UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER
3011  default: {
3012  die("ur2piImageFormat: unsuppported channelOrder.");
3013  }
3014  }
3015 
3016  switch (UrFormat->channelType) {
3017 #define UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(FROM, TO) \
3018  case FROM: { \
3019  PiFormat->image_channel_data_type = TO; \
3020  break; \
3021  }
3022  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_SNORM_INT8,
3024  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_SNORM_INT16,
3026  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_UNORM_INT8,
3028  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_UNORM_INT16,
3030  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_UNORM_SHORT_565,
3032  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_UNORM_SHORT_555,
3034  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_INT_101010,
3036  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_SIGNED_INT8,
3038  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_SIGNED_INT16,
3040  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_SIGNED_INT32,
3042  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8,
3044  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16,
3046  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32,
3048  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_HALF_FLOAT,
3050  UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(UR_IMAGE_CHANNEL_TYPE_FLOAT,
3052 #undef UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE
3053  default: {
3054  die("ur2piImageFormat: unsuppported channelType.");
3055  }
3056  }
3057 }
3058 
3060  const pi_image_format *ImageFormat,
3061  const pi_image_desc *ImageDesc, void *HostPtr,
3062  pi_mem *RetImage) {
3063 
3064  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
3065  PI_ASSERT(RetImage, PI_ERROR_INVALID_VALUE);
3066  PI_ASSERT(ImageFormat, PI_ERROR_INVALID_IMAGE_FORMAT_DESCRIPTOR);
3067 
3068  ur_context_handle_t UrContext =
3069  reinterpret_cast<ur_context_handle_t>(Context);
3070 
3071  ur_mem_flags_t UrFlags{};
3072  if (Flags & PI_MEM_FLAGS_ACCESS_RW) {
3073  UrFlags |= UR_MEM_FLAG_READ_WRITE;
3074  }
3075  if (Flags & PI_MEM_ACCESS_READ_ONLY) {
3076  UrFlags |= UR_MEM_FLAG_READ_ONLY;
3077  }
3078  if (Flags & PI_MEM_FLAGS_HOST_PTR_USE) {
3079  UrFlags |= UR_MEM_FLAG_USE_HOST_POINTER;
3080  }
3081  if (Flags & PI_MEM_FLAGS_HOST_PTR_COPY) {
3082  UrFlags |= UR_MEM_FLAG_ALLOC_COPY_HOST_POINTER;
3083  }
3084  if (Flags & PI_MEM_FLAGS_HOST_PTR_ALLOC) {
3085  UrFlags |= UR_MEM_FLAG_ALLOC_HOST_POINTER;
3086  }
3087 
3088  ur_image_format_t UrFormat{};
3089  ur_image_desc_t UrDesc{};
3090  pi2urImageDesc(ImageFormat, ImageDesc, &UrFormat, &UrDesc);
3091 
3092  // TODO: UrDesc doesn't have something for ImageDesc->buffer
3093 
3094  ur_mem_handle_t *UrMem = reinterpret_cast<ur_mem_handle_t *>(RetImage);
3095  HANDLE_ERRORS(
3096  urMemImageCreate(UrContext, UrFlags, &UrFormat, &UrDesc, HostPtr, UrMem));
3097 
3098  return PI_SUCCESS;
3099 }
3100 
3102  pi_native_handle NativeHandle, pi_context Context, bool OwnNativeHandle,
3103  const pi_image_format *ImageFormat, const pi_image_desc *ImageDesc,
3104  pi_mem *RetImage) {
3105 
3106  PI_ASSERT(RetImage, PI_ERROR_INVALID_VALUE);
3107  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
3108  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
3109 
3110  ur_native_handle_t UrNativeMem =
3111  reinterpret_cast<ur_native_handle_t>(NativeHandle);
3112 
3113  ur_context_handle_t UrContext =
3114  reinterpret_cast<ur_context_handle_t>(Context);
3115 
3116  ur_mem_handle_t *UrMem = reinterpret_cast<ur_mem_handle_t *>(RetImage);
3117  ur_mem_native_properties_t Properties{};
3118  Properties.isNativeHandleOwned = OwnNativeHandle;
3119 
3120  ur_image_format_t UrFormat{};
3121  ur_image_desc_t UrDesc{};
3122  pi2urImageDesc(ImageFormat, ImageDesc, &UrFormat, &UrDesc);
3123 
3124  HANDLE_ERRORS(urMemImageCreateWithNativeHandle(
3125  UrNativeMem, UrContext, &UrFormat, &UrDesc, &Properties, UrMem));
3126 
3127  return PI_SUCCESS;
3128 }
3129 
3131  pi_buffer_create_type BufferCreateType,
3132  void *BufferCreateInfo, pi_mem *RetMem) {
3133 
3134  PI_ASSERT(BufferCreateType == PI_BUFFER_CREATE_TYPE_REGION &&
3135  BufferCreateInfo && RetMem,
3136  PI_ERROR_INVALID_VALUE);
3137 
3138  auto Region = (pi_buffer_region)BufferCreateInfo;
3139  PI_ASSERT(Region->size != 0u, PI_ERROR_INVALID_BUFFER_SIZE);
3140  PI_ASSERT(Region->origin <= (Region->origin + Region->size),
3141  PI_ERROR_INVALID_VALUE);
3142 
3143  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
3144 
3145  ur_mem_flags_t UrFlags{};
3146  if (Flags & PI_MEM_FLAGS_ACCESS_RW) {
3147  UrFlags |= UR_MEM_FLAG_READ_WRITE;
3148  }
3149  if (Flags & PI_MEM_ACCESS_READ_ONLY) {
3150  UrFlags |= UR_MEM_FLAG_READ_ONLY;
3151  }
3152  if (Flags & PI_MEM_FLAGS_HOST_PTR_USE) {
3153  UrFlags |= UR_MEM_FLAG_USE_HOST_POINTER;
3154  }
3155  if (Flags & PI_MEM_FLAGS_HOST_PTR_COPY) {
3156  UrFlags |= UR_MEM_FLAG_ALLOC_COPY_HOST_POINTER;
3157  }
3158  if (Flags & PI_MEM_FLAGS_HOST_PTR_ALLOC) {
3159  UrFlags |= UR_MEM_FLAG_ALLOC_HOST_POINTER;
3160  }
3161 
3162  ur_buffer_create_type_t UrBufferCreateType{};
3163  if (BufferCreateType == PI_BUFFER_CREATE_TYPE_REGION) {
3164  UrBufferCreateType = UR_BUFFER_CREATE_TYPE_REGION;
3165  }
3166 
3167  ur_buffer_region_t UrBufferCreateInfo{};
3168  UrBufferCreateInfo.origin = Region->origin;
3169  UrBufferCreateInfo.size = Region->size;
3170  ur_mem_handle_t *UrMem = reinterpret_cast<ur_mem_handle_t *>(RetMem);
3171  HANDLE_ERRORS(urMemBufferPartition(UrBuffer, UrFlags, UrBufferCreateType,
3172  &UrBufferCreateInfo, UrMem));
3173 
3174  return PI_SUCCESS;
3175 }
3176 
3178  pi_native_handle *NativeHandle) {
3179  PI_ASSERT(Mem, PI_ERROR_INVALID_MEM_OBJECT);
3180 
3181  ur_mem_handle_t UrMem = reinterpret_cast<ur_mem_handle_t>(Mem);
3182  ur_device_handle_t UrDev = reinterpret_cast<ur_device_handle_t>(Dev);
3183  ur_native_handle_t NativeMem{};
3184  HANDLE_ERRORS(urMemGetNativeHandle(UrMem, UrDev, &NativeMem));
3185 
3186  *NativeHandle = reinterpret_cast<pi_native_handle>(NativeMem);
3187 
3188  return PI_SUCCESS;
3189 }
3190 
3191 inline pi_result
3192 piEnqueueMemImageCopy(pi_queue Queue, pi_mem SrcImage, pi_mem DstImage,
3193  pi_image_offset SrcOrigin, pi_image_offset DstOrigin,
3194  pi_image_region Region, pi_uint32 NumEventsInWaitList,
3195  const pi_event *EventsWaitList, pi_event *OutEvent) {
3196 
3197  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3198 
3199  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3200 
3201  ur_mem_handle_t UrImageSrc = reinterpret_cast<ur_mem_handle_t>(SrcImage);
3202  ur_mem_handle_t UrImageDst = reinterpret_cast<ur_mem_handle_t>(DstImage);
3203 
3204  ur_rect_offset_t UrSrcOrigin{SrcOrigin->x, SrcOrigin->y, SrcOrigin->z};
3205  ur_rect_offset_t UrDstOrigin{DstOrigin->x, DstOrigin->y, DstOrigin->z};
3206  ur_rect_region_t UrRegion{};
3207  UrRegion.depth = Region->depth;
3208  UrRegion.height = Region->height;
3209  UrRegion.width = Region->width;
3210 
3211  const ur_event_handle_t *UrEventsWaitList =
3212  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3213 
3214  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3215 
3216  HANDLE_ERRORS(urEnqueueMemImageCopy(
3217  UrQueue, UrImageSrc, UrImageDst, UrSrcOrigin, UrDstOrigin, UrRegion,
3218  NumEventsInWaitList, UrEventsWaitList, UREvent));
3219 
3220  return PI_SUCCESS;
3221 }
3222 
3224  pi_context Context,
3225  bool OwnNativeHandle,
3226  pi_mem *Mem) {
3227  PI_ASSERT(Mem, PI_ERROR_INVALID_VALUE);
3228  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
3229  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
3230 
3231  ur_native_handle_t UrNativeMem =
3232  reinterpret_cast<ur_native_handle_t>(NativeHandle);
3233  ur_context_handle_t UrContext =
3234  reinterpret_cast<ur_context_handle_t>(Context);
3235  ur_mem_handle_t *UrMem = reinterpret_cast<ur_mem_handle_t *>(Mem);
3236  ur_mem_native_properties_t Properties{};
3237  Properties.isNativeHandleOwned = OwnNativeHandle;
3238  HANDLE_ERRORS(urMemBufferCreateWithNativeHandle(UrNativeMem, UrContext,
3239  &Properties, UrMem));
3240 
3241  return PI_SUCCESS;
3242 }
3243 
3244 inline pi_result piextUSMDeviceAlloc(void **ResultPtr, pi_context Context,
3245  pi_device Device,
3246  pi_usm_mem_properties *Properties,
3247  size_t Size, pi_uint32 Alignment) {
3248  ur_context_handle_t UrContext =
3249  reinterpret_cast<ur_context_handle_t>(Context);
3250  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
3251 
3252  ur_usm_desc_t USMDesc{};
3253  USMDesc.align = Alignment;
3254 
3255  ur_usm_alloc_location_desc_t UsmLocDesc{};
3256  UsmLocDesc.stype = UR_STRUCTURE_TYPE_USM_ALLOC_LOCATION_DESC;
3257 
3258  if (Properties) {
3259  uint32_t Next = 0;
3260  while (Properties[Next]) {
3261  if (Properties[Next] == PI_MEM_USM_ALLOC_BUFFER_LOCATION) {
3262  UsmLocDesc.location = static_cast<uint32_t>(Properties[Next + 1]);
3263  USMDesc.pNext = &UsmLocDesc;
3264  } else {
3265  return PI_ERROR_INVALID_VALUE;
3266  }
3267  Next += 2;
3268  }
3269  }
3270 
3271  ur_usm_pool_handle_t Pool{};
3272  HANDLE_ERRORS(
3273  urUSMDeviceAlloc(UrContext, UrDevice, &USMDesc, Pool, Size, ResultPtr));
3274 
3275  return PI_SUCCESS;
3276 }
3277 
3278 inline pi_result piextUSMPitchedAlloc(void **ResultPtr, size_t *ResultPitch,
3279  pi_context Context, pi_device Device,
3280  pi_usm_mem_properties *Properties,
3281  size_t WidthInBytes, size_t Height,
3282  unsigned int ElementSizeBytes) {
3283  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
3284  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
3285 
3286  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
3287  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
3288  std::ignore = Properties;
3289  ur_usm_desc_t USMDesc{};
3290  ur_usm_pool_handle_t Pool{};
3291 
3292  HANDLE_ERRORS(urUSMPitchedAllocExp(UrContext, UrDevice, &USMDesc, Pool,
3293  WidthInBytes, Height, ElementSizeBytes,
3294  ResultPtr, ResultPitch));
3295 
3296  return PI_SUCCESS;
3297 }
3298 
3299 inline pi_result piextUSMSharedAlloc(void **ResultPtr, pi_context Context,
3300  pi_device Device,
3301  pi_usm_mem_properties *Properties,
3302  size_t Size, pi_uint32 Alignment) {
3303  ur_context_handle_t UrContext =
3304  reinterpret_cast<ur_context_handle_t>(Context);
3305  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
3306 
3307  ur_usm_desc_t USMDesc{};
3308  USMDesc.align = Alignment;
3309  ur_usm_device_desc_t UsmDeviceDesc{};
3310  UsmDeviceDesc.stype = UR_STRUCTURE_TYPE_USM_DEVICE_DESC;
3311  ur_usm_host_desc_t UsmHostDesc{};
3312  UsmHostDesc.stype = UR_STRUCTURE_TYPE_USM_HOST_DESC;
3313  ur_usm_alloc_location_desc_t UsmLocationDesc{};
3314  UsmLocationDesc.stype = UR_STRUCTURE_TYPE_USM_ALLOC_LOCATION_DESC;
3315 
3316  // One properties bitfield can correspond to a host_desc and a device_desc
3317  // struct, since having `0` values in these is harmless we can set up this
3318  // pNext chain in advance.
3319  USMDesc.pNext = &UsmDeviceDesc;
3320  UsmDeviceDesc.pNext = &UsmHostDesc;
3321 
3322  if (Properties) {
3323  uint32_t Next = 0;
3324  while (Properties[Next]) {
3325  switch (Properties[Next]) {
3326  case PI_MEM_ALLOC_FLAGS: {
3327  if (Properties[Next + 1] & PI_MEM_ALLOC_WRTITE_COMBINED) {
3328  UsmDeviceDesc.flags |= UR_USM_DEVICE_MEM_FLAG_WRITE_COMBINED;
3329  }
3330  if (Properties[Next + 1] & PI_MEM_ALLOC_INITIAL_PLACEMENT_DEVICE) {
3331  UsmDeviceDesc.flags |= UR_USM_DEVICE_MEM_FLAG_INITIAL_PLACEMENT;
3332  }
3333  if (Properties[Next + 1] & PI_MEM_ALLOC_INITIAL_PLACEMENT_HOST) {
3334  UsmHostDesc.flags |= UR_USM_HOST_MEM_FLAG_INITIAL_PLACEMENT;
3335  }
3336  if (Properties[Next + 1] & PI_MEM_ALLOC_DEVICE_READ_ONLY) {
3337  UsmDeviceDesc.flags |= UR_USM_DEVICE_MEM_FLAG_DEVICE_READ_ONLY;
3338  }
3339  break;
3340  }
3342  UsmLocationDesc.location = static_cast<uint32_t>(Properties[Next + 1]);
3343  // We wait until we've seen a BUFFER_LOCATION property to tack this
3344  // onto the end of the chain, a `0` here might be valid as far as we
3345  // know so we must exclude it unless we've been given a value.
3346  UsmHostDesc.pNext = &UsmLocationDesc;
3347  break;
3348  }
3349  default:
3350  return PI_ERROR_INVALID_VALUE;
3351  }
3352  Next += 2;
3353  }
3354  }
3355 
3356  ur_usm_pool_handle_t Pool{};
3357  HANDLE_ERRORS(
3358  urUSMSharedAlloc(UrContext, UrDevice, &USMDesc, Pool, Size, ResultPtr));
3359 
3360  return PI_SUCCESS;
3361 }
3362 
3363 inline pi_result piextUSMFree(pi_context Context, void *Ptr) {
3364  ur_context_handle_t UrContext =
3365  reinterpret_cast<ur_context_handle_t>(Context);
3366  HANDLE_ERRORS(urUSMFree(UrContext, Ptr));
3367  return PI_SUCCESS;
3368 }
3369 
3371  PI_ASSERT(Mem, PI_ERROR_INVALID_MEM_OBJECT);
3372 
3373  ur_mem_handle_t UrMem = reinterpret_cast<ur_mem_handle_t>(Mem);
3374 
3375  HANDLE_ERRORS(urMemRetain(UrMem));
3376 
3377  return PI_SUCCESS;
3378 }
3379 
3381  PI_ASSERT(Mem, PI_ERROR_INVALID_MEM_OBJECT);
3382 
3383  ur_mem_handle_t UrMem = reinterpret_cast<ur_mem_handle_t>(Mem);
3384 
3385  HANDLE_ERRORS(urMemRelease(UrMem));
3386 
3387  return PI_SUCCESS;
3388 }
3389 
3399 inline pi_result piextUSMEnqueuePrefetch(pi_queue Queue, const void *Ptr,
3400  size_t Size,
3401  pi_usm_migration_flags Flags,
3402  pi_uint32 NumEventsInWaitList,
3403  const pi_event *EventsWaitList,
3404  pi_event *OutEvent) {
3405 
3406  // flags is currently unused so fail if set
3407  PI_ASSERT(Flags == 0, PI_ERROR_INVALID_VALUE);
3408  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3409 
3410  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3411 
3412  const ur_event_handle_t *UrEventsWaitList =
3413  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3414 
3415  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3416 
3417  // TODO: to map from pi_usm_migration_flags to
3418  // ur_usm_migration_flags_t
3419  // once we have those defined
3420  ur_usm_migration_flags_t UrFlags{};
3421  HANDLE_ERRORS(urEnqueueUSMPrefetch(UrQueue, Ptr, Size, UrFlags,
3422  NumEventsInWaitList, UrEventsWaitList,
3423  UREvent));
3424 
3425  return PI_SUCCESS;
3426 }
3427 
3436 inline pi_result piextUSMEnqueueMemAdvise(pi_queue Queue, const void *Ptr,
3437  size_t Length, pi_mem_advice Advice,
3438  pi_event *OutEvent) {
3439 
3440  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3441 
3442  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3443 
3444  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3445 
3446  ur_usm_advice_flags_t UrAdvice{};
3447  if (Advice & PI_MEM_ADVICE_CUDA_SET_READ_MOSTLY) {
3448  UrAdvice |= UR_USM_ADVICE_FLAG_SET_READ_MOSTLY;
3449  }
3450  if (Advice & PI_MEM_ADVICE_CUDA_UNSET_READ_MOSTLY) {
3451  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_READ_MOSTLY;
3452  }
3454  UrAdvice |= UR_USM_ADVICE_FLAG_SET_PREFERRED_LOCATION;
3455  }
3457  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_PREFERRED_LOCATION;
3458  }
3459  if (Advice & PI_MEM_ADVICE_CUDA_SET_ACCESSED_BY) {
3460  UrAdvice |= UR_USM_ADVICE_FLAG_SET_ACCESSED_BY_DEVICE;
3461  }
3462  if (Advice & PI_MEM_ADVICE_CUDA_UNSET_ACCESSED_BY) {
3463  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_ACCESSED_BY_DEVICE;
3464  }
3466  UrAdvice |= UR_USM_ADVICE_FLAG_SET_ACCESSED_BY_HOST;
3467  }
3469  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_ACCESSED_BY_HOST;
3470  }
3471  if (Advice & PI_MEM_ADVICE_HIP_SET_COARSE_GRAINED) {
3472  UrAdvice |= UR_USM_ADVICE_FLAG_SET_NON_COHERENT_MEMORY;
3473  }
3475  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_NON_COHERENT_MEMORY;
3476  }
3477  if (Advice & PI_MEM_ADVICE_RESET) {
3478  UrAdvice |= UR_USM_ADVICE_FLAG_DEFAULT;
3479  }
3480 
3481  HANDLE_ERRORS(urEnqueueUSMAdvise(UrQueue, Ptr, Length, UrAdvice, UREvent));
3482 
3483  return PI_SUCCESS;
3484 }
3485 
3498 inline pi_result piextUSMEnqueueFill2D(pi_queue Queue, void *Ptr, size_t Pitch,
3499  size_t PatternSize, const void *Pattern,
3500  size_t Width, size_t Height,
3501  pi_uint32 NumEventsWaitList,
3502  const pi_event *EventsWaitList,
3503  pi_event *Event) {
3504 
3505  auto hQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3506  auto phEventWaitList =
3507  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3508  auto phEvent = reinterpret_cast<ur_event_handle_t *>(Event);
3509 
3510  HANDLE_ERRORS(urEnqueueUSMFill2D(hQueue, Ptr, Pitch, PatternSize, Pattern,
3511  Width, Height, NumEventsWaitList,
3512  phEventWaitList, phEvent));
3513 
3514  return PI_SUCCESS;
3515 }
3516 
3518  size_t Pitch, int Value, size_t Width,
3519  size_t Height,
3520  pi_uint32 NumEventsWaitList,
3521  const pi_event *EventsWaitList,
3522  pi_event *Event) {
3523  std::ignore = Queue;
3524  std::ignore = Ptr;
3525  std::ignore = Pitch;
3526  std::ignore = Value;
3527  std::ignore = Width;
3528  std::ignore = Height;
3529  std::ignore = NumEventsWaitList;
3530  std::ignore = EventsWaitList;
3531  std::ignore = Event;
3532  die("piextUSMEnqueueMemset2D: not implemented");
3533  return PI_SUCCESS;
3534 }
3535 
3536 inline pi_result piextUSMGetMemAllocInfo(pi_context Context, const void *Ptr,
3537  pi_mem_alloc_info ParamName,
3538  size_t ParamValueSize,
3539  void *ParamValue,
3540  size_t *ParamValueSizeRet) {
3541 
3542  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
3543 
3544  ur_context_handle_t UrContext =
3545  reinterpret_cast<ur_context_handle_t>(Context);
3546 
3547  ur_usm_alloc_info_t UrParamName{};
3548  switch (ParamName) {
3549  case PI_MEM_ALLOC_TYPE: {
3550  UrParamName = UR_USM_ALLOC_INFO_TYPE;
3551  break;
3552  }
3553  case PI_MEM_ALLOC_BASE_PTR: {
3554  UrParamName = UR_USM_ALLOC_INFO_BASE_PTR;
3555  break;
3556  }
3557  case PI_MEM_ALLOC_SIZE: {
3558  UrParamName = UR_USM_ALLOC_INFO_SIZE;
3559  break;
3560  }
3561  case PI_MEM_ALLOC_DEVICE: {
3562  UrParamName = UR_USM_ALLOC_INFO_DEVICE;
3563  break;
3564  }
3565  default: {
3566  die("piextUSMGetMemAllocInfo: unsuppported ParamName.");
3567  }
3568  }
3569 
3570  size_t SizeInOut = ParamValueSize;
3571  HANDLE_ERRORS(urUSMGetMemAllocInfo(UrContext, Ptr, UrParamName,
3572  ParamValueSize, ParamValue,
3573  ParamValueSizeRet))
3574  ur2piUSMAllocInfoValue(UrParamName, ParamValueSize, &SizeInOut, ParamValue);
3575  return PI_SUCCESS;
3576 }
3577 
3578 inline pi_result piextUSMImport(const void *HostPtr, size_t Size,
3579  pi_context Context) {
3580 
3581  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
3582 
3583  ur_context_handle_t UrContext =
3584  reinterpret_cast<ur_context_handle_t>(Context);
3585 
3586  HANDLE_ERRORS(urUSMImportExp(UrContext, const_cast<void *>(HostPtr), Size));
3587  return PI_SUCCESS;
3588 }
3589 
3590 inline pi_result piextUSMRelease(const void *HostPtr, pi_context Context) {
3591 
3592  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
3593 
3594  ur_context_handle_t UrContext =
3595  reinterpret_cast<ur_context_handle_t>(Context);
3596 
3597  HANDLE_ERRORS(urUSMReleaseExp(UrContext, const_cast<void *>(HostPtr)));
3598  return PI_SUCCESS;
3599 }
3600 
3602  size_t ParamValueSize, void *ParamValue,
3603  size_t *ParamValueSizeRet) {
3604 
3605  auto hMem = reinterpret_cast<ur_mem_handle_t>(Image);
3606 
3607  ur_image_info_t UrParamName{};
3608  switch (ParamName) {
3609  case PI_IMAGE_INFO_FORMAT: {
3610  UrParamName = UR_IMAGE_INFO_FORMAT;
3611  break;
3612  }
3614  UrParamName = UR_IMAGE_INFO_ELEMENT_SIZE;
3615  break;
3616  }
3617  case PI_IMAGE_INFO_ROW_PITCH: {
3618  UrParamName = UR_IMAGE_INFO_ROW_PITCH;
3619  break;
3620  }
3622  UrParamName = UR_IMAGE_INFO_SLICE_PITCH;
3623  break;
3624  }
3625  case PI_IMAGE_INFO_WIDTH: {
3626  UrParamName = UR_IMAGE_INFO_WIDTH;
3627  break;
3628  }
3629  case PI_IMAGE_INFO_HEIGHT: {
3630  UrParamName = UR_IMAGE_INFO_HEIGHT;
3631  break;
3632  }
3633  case PI_IMAGE_INFO_DEPTH: {
3634  UrParamName = UR_IMAGE_INFO_DEPTH;
3635  break;
3636  }
3637  default:
3638  return PI_ERROR_UNKNOWN;
3639  }
3640 
3641  HANDLE_ERRORS(urMemImageGetInfo(hMem, UrParamName, ParamValueSize, ParamValue,
3642  ParamValueSizeRet));
3643  return PI_SUCCESS;
3644 }
3645 
3661  void *DstPtr, size_t DstPitch,
3662  const void *SrcPtr, size_t SrcPitch,
3663  size_t Width, size_t Height,
3664  pi_uint32 NumEventsInWaitList,
3665  const pi_event *EventsWaitList,
3666  pi_event *OutEvent) {
3667 
3668  if (!DstPtr || !SrcPtr)
3669  return PI_ERROR_INVALID_VALUE;
3670 
3671  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3672 
3673  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3674  const ur_event_handle_t *UrEventsWaitList =
3675  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3676 
3677  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3678 
3679  HANDLE_ERRORS(urEnqueueUSMMemcpy2D(
3680  UrQueue, Blocking, DstPtr, DstPitch, SrcPtr, SrcPitch, Width, Height,
3681  NumEventsInWaitList, UrEventsWaitList, UREvent));
3682 
3683  return PI_SUCCESS;
3684 }
3685 
3686 // Memory
3688 
3690 // Enqueue
3691 
3692 inline pi_result
3694  const size_t *GlobalWorkOffset,
3695  const size_t *GlobalWorkSize, const size_t *LocalWorkSize,
3696  pi_uint32 NumEventsInWaitList,
3697  const pi_event *EventsWaitList, pi_event *OutEvent) {
3698 
3699  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
3700  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3701  PI_ASSERT((WorkDim > 0) && (WorkDim < 4), PI_ERROR_INVALID_WORK_DIMENSION);
3702 
3703  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3704  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
3705  const ur_event_handle_t *UrEventsWaitList =
3706  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3707 
3708  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3709 
3710  HANDLE_ERRORS(urEnqueueKernelLaunch(
3711  UrQueue, UrKernel, WorkDim, GlobalWorkOffset, GlobalWorkSize,
3712  LocalWorkSize, NumEventsInWaitList, UrEventsWaitList, UREvent));
3713 
3714  return PI_SUCCESS;
3715 }
3716 
3718  pi_queue Queue, pi_kernel Kernel, pi_uint32 WorkDim,
3719  const size_t *GlobalWorkOffset, const size_t *GlobalWorkSize,
3720  const size_t *LocalWorkSize, pi_uint32 NumEventsInWaitList,
3721  const pi_event *EventsWaitList, pi_event *OutEvent) {
3722 
3723  PI_ASSERT(Kernel, PI_ERROR_INVALID_KERNEL);
3724  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3725  PI_ASSERT((WorkDim > 0) && (WorkDim < 4), PI_ERROR_INVALID_WORK_DIMENSION);
3726 
3727  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3728  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
3729  const ur_event_handle_t *UrEventsWaitList =
3730  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3731 
3732  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3733 
3734  HANDLE_ERRORS(urEnqueueCooperativeKernelLaunchExp(
3735  UrQueue, UrKernel, WorkDim, GlobalWorkOffset, GlobalWorkSize,
3736  LocalWorkSize, NumEventsInWaitList, UrEventsWaitList, UREvent));
3737 
3738  return PI_SUCCESS;
3739 }
3740 
3741 inline pi_result
3742 piEnqueueMemImageWrite(pi_queue Queue, pi_mem Image, pi_bool BlockingWrite,
3743  pi_image_offset Origin, pi_image_region Region,
3744  size_t InputRowPitch, size_t InputSlicePitch,
3745  const void *Ptr, pi_uint32 NumEventsInWaitList,
3746  const pi_event *EventsWaitList, pi_event *OutEvent) {
3747 
3748  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3749 
3750  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3751  ur_mem_handle_t UrImage = reinterpret_cast<ur_mem_handle_t>(Image);
3752  ur_rect_offset_t UrOrigin{Origin->x, Origin->y, Origin->z};
3753  ur_rect_region_t UrRegion{};
3754  UrRegion.depth = Region->depth;
3755  UrRegion.height = Region->height;
3756  UrRegion.width = Region->width;
3757  const ur_event_handle_t *UrEventsWaitList =
3758  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3759 
3760  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3761 
3762  HANDLE_ERRORS(urEnqueueMemImageWrite(
3763  UrQueue, UrImage, BlockingWrite, UrOrigin, UrRegion, InputRowPitch,
3764  InputSlicePitch, const_cast<void *>(Ptr), NumEventsInWaitList,
3765  UrEventsWaitList, UREvent));
3766 
3767  return PI_SUCCESS;
3768 }
3769 
3770 inline pi_result
3771 piEnqueueMemImageRead(pi_queue Queue, pi_mem Image, pi_bool BlockingRead,
3772  pi_image_offset Origin, pi_image_region Region,
3773  size_t RowPitch, size_t SlicePitch, void *Ptr,
3774  pi_uint32 NumEventsInWaitList,
3775  const pi_event *EventsWaitList, pi_event *OutEvent) {
3776  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3777 
3778  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3779  ur_mem_handle_t UrImage = reinterpret_cast<ur_mem_handle_t>(Image);
3780  ur_rect_offset_t UrOrigin{Origin->x, Origin->y, Origin->z};
3781  ur_rect_region_t UrRegion{};
3782  UrRegion.depth = Region->depth;
3783  UrRegion.height = Region->height;
3784  UrRegion.width = Region->width;
3785  const ur_event_handle_t *UrEventsWaitList =
3786  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3787 
3788  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3789 
3790  HANDLE_ERRORS(urEnqueueMemImageRead(
3791  UrQueue, UrImage, BlockingRead, UrOrigin, UrRegion, RowPitch, SlicePitch,
3792  Ptr, NumEventsInWaitList, UrEventsWaitList, UREvent));
3793 
3794  return PI_SUCCESS;
3795 }
3796 
3798  pi_queue Queue, pi_mem Mem, pi_bool BlockingMap, pi_map_flags MapFlags,
3799  size_t Offset, size_t Size, pi_uint32 NumEventsInWaitList,
3800  const pi_event *EventsWaitList, pi_event *OutEvent, void **RetMap) {
3801  // TODO: we don't implement read-only or write-only, always read-write.
3802  // assert((map_flags & PI_MAP_READ) != 0);
3803  // assert((map_flags & PI_MAP_WRITE) != 0);
3804  PI_ASSERT(Mem, PI_ERROR_INVALID_MEM_OBJECT);
3805  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3806 
3807  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3808  ur_mem_handle_t UrMem = reinterpret_cast<ur_mem_handle_t>(Mem);
3809 
3810  ur_map_flags_t UrMapFlags{};
3811  if (MapFlags & PI_MAP_READ)
3812  UrMapFlags |= UR_MAP_FLAG_READ;
3813  if (MapFlags & PI_MAP_WRITE)
3814  UrMapFlags |= UR_MAP_FLAG_WRITE;
3815  if (MapFlags & PI_MAP_WRITE_INVALIDATE_REGION)
3816  UrMapFlags |= UR_MAP_FLAG_WRITE_INVALIDATE_REGION;
3817 
3818  const ur_event_handle_t *UrEventsWaitList =
3819  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3820 
3821  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3822 
3823  HANDLE_ERRORS(urEnqueueMemBufferMap(UrQueue, UrMem, BlockingMap, UrMapFlags,
3824  Offset, Size, NumEventsInWaitList,
3825  UrEventsWaitList, UREvent, RetMap));
3826 
3827  return PI_SUCCESS;
3828 }
3829 
3830 inline pi_result piEnqueueMemUnmap(pi_queue Queue, pi_mem Mem, void *MappedPtr,
3831  pi_uint32 NumEventsInWaitList,
3832  const pi_event *EventsWaitList,
3833  pi_event *OutEvent) {
3834 
3835  PI_ASSERT(Mem, PI_ERROR_INVALID_MEM_OBJECT);
3836  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3837 
3838  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3839  ur_mem_handle_t UrMem = reinterpret_cast<ur_mem_handle_t>(Mem);
3840  const ur_event_handle_t *UrEventsWaitList =
3841  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3842 
3843  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3844 
3845  HANDLE_ERRORS(urEnqueueMemUnmap(UrQueue, UrMem, MappedPtr,
3846  NumEventsInWaitList, UrEventsWaitList,
3847  UREvent));
3848 
3849  return PI_SUCCESS;
3850 }
3851 
3853  const void *Pattern, size_t PatternSize,
3854  size_t Offset, size_t Size,
3855  pi_uint32 NumEventsInWaitList,
3856  const pi_event *EventsWaitList,
3857  pi_event *OutEvent) {
3858  PI_ASSERT(Buffer, PI_ERROR_INVALID_MEM_OBJECT);
3859  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3860 
3861  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3862  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
3863  const ur_event_handle_t *UrEventsWaitList =
3864  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3865 
3866  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3867 
3868  HANDLE_ERRORS(urEnqueueMemBufferFill(UrQueue, UrBuffer, Pattern, PatternSize,
3869  Offset, Size, NumEventsInWaitList,
3870  UrEventsWaitList, UREvent));
3871  return PI_SUCCESS;
3872 }
3873 
3874 inline pi_result piextUSMEnqueueMemset(pi_queue Queue, void *Ptr,
3875  pi_int32 Value, size_t Count,
3876  pi_uint32 NumEventsInWaitList,
3877  const pi_event *EventsWaitList,
3878  pi_event *OutEvent) {
3879  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3880  if (!Ptr) {
3881  return PI_ERROR_INVALID_VALUE;
3882  }
3883 
3884  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3885  const ur_event_handle_t *UrEventsWaitList =
3886  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3887 
3888  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3889 
3890  size_t PatternSize = 1;
3891  HANDLE_ERRORS(urEnqueueUSMFill(UrQueue, Ptr, PatternSize, &Value, Count,
3892  NumEventsInWaitList, UrEventsWaitList,
3893  UREvent));
3894 
3895  return PI_SUCCESS;
3896 }
3897 
3899  pi_queue Queue, pi_mem SrcMem, pi_mem DstMem, pi_buff_rect_offset SrcOrigin,
3900  pi_buff_rect_offset DstOrigin, pi_buff_rect_region Region,
3901  size_t SrcRowPitch, size_t SrcSlicePitch, size_t DstRowPitch,
3902  size_t DstSlicePitch, pi_uint32 NumEventsInWaitList,
3903  const pi_event *EventsWaitList, pi_event *OutEvent) {
3904 
3905  PI_ASSERT(SrcMem && DstMem, PI_ERROR_INVALID_MEM_OBJECT);
3906  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3907 
3908  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3909  ur_mem_handle_t UrBufferSrc = reinterpret_cast<ur_mem_handle_t>(SrcMem);
3910  ur_mem_handle_t UrBufferDst = reinterpret_cast<ur_mem_handle_t>(DstMem);
3911  ur_rect_offset_t UrSrcOrigin{SrcOrigin->x_bytes, SrcOrigin->y_scalar,
3912  SrcOrigin->z_scalar};
3913  ur_rect_offset_t UrDstOrigin{DstOrigin->x_bytes, DstOrigin->y_scalar,
3914  DstOrigin->z_scalar};
3915  ur_rect_region_t UrRegion{};
3916  UrRegion.depth = Region->depth_scalar;
3917  UrRegion.height = Region->height_scalar;
3918  UrRegion.width = Region->width_bytes;
3919  const ur_event_handle_t *UrEventsWaitList =
3920  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3921 
3922  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3923 
3924  HANDLE_ERRORS(urEnqueueMemBufferCopyRect(
3925  UrQueue, UrBufferSrc, UrBufferDst, UrSrcOrigin, UrDstOrigin, UrRegion,
3926  SrcRowPitch, SrcSlicePitch, DstRowPitch, DstSlicePitch,
3927  NumEventsInWaitList, UrEventsWaitList, UREvent));
3928 
3929  return PI_SUCCESS;
3930 }
3931 
3933  pi_mem DstMem, size_t SrcOffset,
3934  size_t DstOffset, size_t Size,
3935  pi_uint32 NumEventsInWaitList,
3936  const pi_event *EventsWaitList,
3937  pi_event *OutEvent) {
3938 
3939  PI_ASSERT(SrcMem && DstMem, PI_ERROR_INVALID_MEM_OBJECT);
3940  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3941 
3942  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3943  ur_mem_handle_t UrBufferSrc = reinterpret_cast<ur_mem_handle_t>(SrcMem);
3944  ur_mem_handle_t UrBufferDst = reinterpret_cast<ur_mem_handle_t>(DstMem);
3945  const ur_event_handle_t *UrEventsWaitList =
3946  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3947 
3948  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3949 
3950  HANDLE_ERRORS(urEnqueueMemBufferCopy(
3951  UrQueue, UrBufferSrc, UrBufferDst, SrcOffset, DstOffset, Size,
3952  NumEventsInWaitList, UrEventsWaitList, UREvent));
3953 
3954  return PI_SUCCESS;
3955 }
3956 
3958  void *DstPtr, const void *SrcPtr,
3959  size_t Size,
3960  pi_uint32 NumEventsInWaitList,
3961  const pi_event *EventsWaitList,
3962  pi_event *OutEvent) {
3963 
3964  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3965  const ur_event_handle_t *UrEventsWaitList =
3966  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
3967 
3968  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
3969 
3970  HANDLE_ERRORS(urEnqueueUSMMemcpy(UrQueue, Blocking, DstPtr, SrcPtr, Size,
3971  NumEventsInWaitList, UrEventsWaitList,
3972  UREvent));
3973 
3974  return PI_SUCCESS;
3975 }
3976 
3978  pi_queue Queue, pi_mem Buffer, pi_bool BlockingWrite,
3979  pi_buff_rect_offset BufferOffset, pi_buff_rect_offset HostOffset,
3980  pi_buff_rect_region Region, size_t BufferRowPitch, size_t BufferSlicePitch,
3981  size_t HostRowPitch, size_t HostSlicePitch, const void *Ptr,
3982  pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList,
3983  pi_event *OutEvent) {
3984 
3985  PI_ASSERT(Buffer, PI_ERROR_INVALID_MEM_OBJECT);
3986  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
3987 
3988  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
3989  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
3990  ur_rect_offset_t UrBufferOffset{BufferOffset->x_bytes, BufferOffset->y_scalar,
3991  BufferOffset->z_scalar};
3992  ur_rect_offset_t UrHostOffset{HostOffset->x_bytes, HostOffset->y_scalar,
3993  HostOffset->z_scalar};
3994  ur_rect_region_t UrRegion{};
3995  UrRegion.depth = Region->depth_scalar;
3996  UrRegion.height = Region->height_scalar;
3997  UrRegion.width = Region->width_bytes;
3998  const ur_event_handle_t *UrEventsWaitList =
3999  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
4000 
4001  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
4002 
4003  HANDLE_ERRORS(urEnqueueMemBufferWriteRect(
4004  UrQueue, UrBuffer, BlockingWrite, UrBufferOffset, UrHostOffset, UrRegion,
4005  BufferRowPitch, BufferSlicePitch, HostRowPitch, HostSlicePitch,
4006  const_cast<void *>(Ptr), NumEventsInWaitList, UrEventsWaitList, UREvent));
4007 
4008  return PI_SUCCESS;
4009 }
4010 
4012  pi_bool BlockingWrite, size_t Offset,
4013  size_t Size, const void *Ptr,
4014  pi_uint32 NumEventsInWaitList,
4015  const pi_event *EventsWaitList,
4016  pi_event *OutEvent) {
4017 
4018  PI_ASSERT(Buffer, PI_ERROR_INVALID_MEM_OBJECT);
4019  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
4020 
4021  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
4022  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
4023  const ur_event_handle_t *UrEventsWaitList =
4024  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
4025 
4026  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
4027 
4028  HANDLE_ERRORS(urEnqueueMemBufferWrite(
4029  UrQueue, UrBuffer, BlockingWrite, Offset, Size, const_cast<void *>(Ptr),
4030  NumEventsInWaitList, UrEventsWaitList, UREvent));
4031 
4032  return PI_SUCCESS;
4033 }
4034 
4036  pi_queue Queue, pi_mem Buffer, pi_bool BlockingRead,
4037  pi_buff_rect_offset BufferOffset, pi_buff_rect_offset HostOffset,
4038  pi_buff_rect_region Region, size_t BufferRowPitch, size_t BufferSlicePitch,
4039  size_t HostRowPitch, size_t HostSlicePitch, void *Ptr,
4040  pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList,
4041  pi_event *OutEvent) {
4042 
4043  PI_ASSERT(Buffer, PI_ERROR_INVALID_MEM_OBJECT);
4044  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
4045 
4046  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
4047  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
4048  ur_rect_offset_t UrBufferOffset{BufferOffset->x_bytes, BufferOffset->y_scalar,
4049  BufferOffset->z_scalar};
4050  ur_rect_offset_t UrHostOffset{HostOffset->x_bytes, HostOffset->y_scalar,
4051  HostOffset->z_scalar};
4052  ur_rect_region_t UrRegion{};
4053  UrRegion.depth = Region->depth_scalar;
4054  UrRegion.height = Region->height_scalar;
4055  UrRegion.width = Region->width_bytes;
4056 
4057  const ur_event_handle_t *UrEventsWaitList =
4058  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
4059 
4060  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
4061 
4062  HANDLE_ERRORS(urEnqueueMemBufferReadRect(
4063  UrQueue, UrBuffer, BlockingRead, UrBufferOffset, UrHostOffset, UrRegion,
4064  BufferRowPitch, BufferSlicePitch, HostRowPitch, HostSlicePitch, Ptr,
4065  NumEventsInWaitList, UrEventsWaitList, UREvent));
4066 
4067  return PI_SUCCESS;
4068 }
4069 
4071  pi_bool BlockingRead, size_t Offset,
4072  size_t Size, void *Dst,
4073  pi_uint32 NumEventsInWaitList,
4074  const pi_event *EventsWaitList,
4075  pi_event *OutEvent) {
4076  PI_ASSERT(Src, PI_ERROR_INVALID_MEM_OBJECT);
4077  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
4078 
4079  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
4080  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Src);
4081  const ur_event_handle_t *UrEventsWaitList =
4082  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
4083 
4084  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
4085 
4086  HANDLE_ERRORS(urEnqueueMemBufferRead(UrQueue, UrBuffer, BlockingRead, Offset,
4087  Size, Dst, NumEventsInWaitList,
4088  UrEventsWaitList, UREvent));
4089 
4090  return PI_SUCCESS;
4091 }
4092 
4094  pi_uint32 NumEventsInWaitList,
4095  const pi_event *EventsWaitList,
4096  pi_event *OutEvent) {
4097 
4098  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
4099 
4100  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
4101  const ur_event_handle_t *UrEventsWaitList =
4102  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
4103 
4104  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
4105 
4106  HANDLE_ERRORS(urEnqueueEventsWaitWithBarrier(UrQueue, NumEventsInWaitList,
4107  UrEventsWaitList, UREvent));
4108 
4109  return PI_SUCCESS;
4110 }
4111 
4113  pi_uint32 NumEventsInWaitList,
4114  const pi_event *EventsWaitList,
4115  pi_event *OutEvent) {
4116 
4117  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
4118  if (EventsWaitList) {
4119  PI_ASSERT(NumEventsInWaitList > 0, PI_ERROR_INVALID_VALUE);
4120  }
4121 
4122  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
4123  const ur_event_handle_t *UrEventsWaitList =
4124  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
4125 
4126  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(OutEvent);
4127 
4128  HANDLE_ERRORS(urEnqueueEventsWait(UrQueue, NumEventsInWaitList,
4129  UrEventsWaitList, UREvent));
4130 
4131  return PI_SUCCESS;
4132 }
4133 
4134 inline pi_result
4136  const char *pipe_symbol, pi_bool blocking, void *ptr,
4137  size_t size, pi_uint32 num_events_in_waitlist,
4138  const pi_event *events_waitlist, pi_event *event) {
4139  auto hQueue = reinterpret_cast<ur_queue_handle_t>(queue);
4140  auto hProgram = reinterpret_cast<ur_program_handle_t>(program);
4141  auto phEventWaitList =
4142  reinterpret_cast<const ur_event_handle_t *>(events_waitlist);
4143  auto phEvent = reinterpret_cast<ur_event_handle_t *>(event);
4144 
4145  HANDLE_ERRORS(urEnqueueReadHostPipe(hQueue, hProgram, pipe_symbol, blocking,
4146  ptr, size, num_events_in_waitlist,
4147  phEventWaitList, phEvent));
4148 
4149  return PI_SUCCESS;
4150 }
4151 
4152 inline pi_result
4154  const char *pipe_symbol, pi_bool blocking, void *ptr,
4155  size_t size, pi_uint32 num_events_in_waitlist,
4156  const pi_event *events_waitlist, pi_event *event) {
4157  auto hQueue = reinterpret_cast<ur_queue_handle_t>(queue);
4158  auto hProgram = reinterpret_cast<ur_program_handle_t>(program);
4159  auto phEventWaitList =
4160  reinterpret_cast<const ur_event_handle_t *>(events_waitlist);
4161  auto phEvent = reinterpret_cast<ur_event_handle_t *>(event);
4162 
4163  HANDLE_ERRORS(urEnqueueWriteHostPipe(hQueue, hProgram, pipe_symbol, blocking,
4164  ptr, size, num_events_in_waitlist,
4165  phEventWaitList, phEvent));
4166 
4167  return PI_SUCCESS;
4168 }
4169 // Enqueue
4171 
4173 // Events
4175  const pi_event *EventsWaitList) {
4176  if (NumEvents && !EventsWaitList) {
4177  return PI_ERROR_INVALID_EVENT;
4178  }
4179 
4180  const ur_event_handle_t *UrEventsWaitList =
4181  reinterpret_cast<const ur_event_handle_t *>(EventsWaitList);
4182 
4183  HANDLE_ERRORS(urEventWait(NumEvents, UrEventsWaitList));
4184 
4185  return PI_SUCCESS;
4186 }
4187 
4189  size_t ParamValueSize, void *ParamValue,
4190  size_t *ParamValueSizeRet) {
4191 
4192  PI_ASSERT(Event, PI_ERROR_INVALID_EVENT);
4193 
4194  ur_event_handle_t UREvent = reinterpret_cast<ur_event_handle_t>(Event);
4195 
4196  ur_event_info_t PropName{};
4197  if (ParamName == PI_EVENT_INFO_COMMAND_QUEUE) {
4198  PropName = UR_EVENT_INFO_COMMAND_QUEUE;
4199  } else if (ParamName == PI_EVENT_INFO_CONTEXT) {
4200  PropName = UR_EVENT_INFO_CONTEXT;
4201  } else if (ParamName == PI_EVENT_INFO_COMMAND_TYPE) {
4202  PropName = UR_EVENT_INFO_COMMAND_TYPE;
4203  } else if (ParamName == PI_EVENT_INFO_COMMAND_EXECUTION_STATUS) {
4204  PropName = UR_EVENT_INFO_COMMAND_EXECUTION_STATUS;
4205  } else if (ParamName == PI_EVENT_INFO_REFERENCE_COUNT) {
4206  PropName = UR_EVENT_INFO_REFERENCE_COUNT;
4207  } else {
4208  return PI_ERROR_INVALID_VALUE;
4209  }
4210 
4211  HANDLE_ERRORS(urEventGetInfo(UREvent, PropName, ParamValueSize, ParamValue,
4212  ParamValueSizeRet));
4213 
4214  return PI_SUCCESS;
4215 }
4216 
4218  pi_native_handle *NativeHandle) {
4219 
4220  PI_ASSERT(Event, PI_ERROR_INVALID_EVENT);
4221  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
4222 
4223  ur_event_handle_t UREvent = reinterpret_cast<ur_event_handle_t>(Event);
4224 
4225  ur_native_handle_t *UrNativeEvent =
4226  reinterpret_cast<ur_native_handle_t *>(NativeHandle);
4227  HANDLE_ERRORS(urEventGetNativeHandle(UREvent, UrNativeEvent));
4228 
4229  return PI_SUCCESS;
4230 }
4231 
4233  pi_profiling_info ParamName,
4234  size_t ParamValueSize,
4235  void *ParamValue,
4236  size_t *ParamValueSizeRet) {
4237 
4238  PI_ASSERT(Event, PI_ERROR_INVALID_EVENT);
4239 
4240  ur_event_handle_t UREvent = reinterpret_cast<ur_event_handle_t>(Event);
4241 
4242  ur_profiling_info_t PropName{};
4243  switch (ParamName) {
4245  PropName = UR_PROFILING_INFO_COMMAND_QUEUED;
4246  break;
4247  }
4249  PropName = UR_PROFILING_INFO_COMMAND_SUBMIT;
4250  break;
4251  }
4253  PropName = UR_PROFILING_INFO_COMMAND_START;
4254  break;
4255  }
4257  PropName = UR_PROFILING_INFO_COMMAND_END;
4258  break;
4259  }
4260  default:
4261  return PI_ERROR_INVALID_PROPERTY;
4262  }
4263 
4264  HANDLE_ERRORS(urEventGetProfilingInfo(UREvent, PropName, ParamValueSize,
4265  ParamValue, ParamValueSizeRet));
4266 
4267  return PI_SUCCESS;
4268 }
4269 
4270 inline pi_result piEventCreate(pi_context Context, pi_event *RetEvent) {
4271 
4272  ur_context_handle_t UrContext =
4273  reinterpret_cast<ur_context_handle_t>(Context);
4274 
4275  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(RetEvent);
4276  // pass null for the hNativeHandle to use urEventCreateWithNativeHandle
4277  // as urEventCreate
4278  ur_event_native_properties_t Properties{};
4279  HANDLE_ERRORS(
4280  urEventCreateWithNativeHandle(nullptr, UrContext, &Properties, UREvent));
4281 
4282  return PI_SUCCESS;
4283 }
4284 
4286  pi_context Context,
4287  bool OwnNativeHandle,
4288  pi_event *Event) {
4289 
4290  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
4291  PI_ASSERT(Event, PI_ERROR_INVALID_EVENT);
4292  PI_ASSERT(NativeHandle, PI_ERROR_INVALID_VALUE);
4293 
4294  ur_native_handle_t UrNativeKernel =
4295  reinterpret_cast<ur_native_handle_t>(NativeHandle);
4296 
4297  ur_context_handle_t UrContext =
4298  reinterpret_cast<ur_context_handle_t>(Context);
4299 
4300  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(Event);
4301  ur_event_native_properties_t Properties{};
4302  Properties.isNativeHandleOwned = OwnNativeHandle;
4303  HANDLE_ERRORS(urEventCreateWithNativeHandle(UrNativeKernel, UrContext,
4304  &Properties, UREvent));
4305 
4306  return PI_SUCCESS;
4307 }
4308 
4310  pi_event Event, pi_int32 CommandExecCallbackType,
4311  void (*PFnNotify)(pi_event Event, pi_int32 EventCommandStatus,
4312  void *UserData),
4313  void *UserData) {
4314  std::ignore = Event;
4315  std::ignore = CommandExecCallbackType;
4316  std::ignore = PFnNotify;
4317  std::ignore = UserData;
4318  die("piEventSetCallback: deprecated, to be removed");
4319  return PI_SUCCESS;
4320 }
4321 
4322 inline pi_result piEventSetStatus(pi_event Event, pi_int32 ExecutionStatus) {
4323  std::ignore = Event;
4324  std::ignore = ExecutionStatus;
4325  die("piEventSetStatus: deprecated, to be removed");
4326  return PI_SUCCESS;
4327 }
4328 
4330  PI_ASSERT(Event, PI_ERROR_INVALID_EVENT);
4331 
4332  ur_event_handle_t UREvent = reinterpret_cast<ur_event_handle_t>(Event);
4333  HANDLE_ERRORS(urEventRetain(UREvent));
4334 
4335  return PI_SUCCESS;
4336 }
4337 
4339  PI_ASSERT(Event, PI_ERROR_INVALID_EVENT);
4340 
4341  ur_event_handle_t UREvent = reinterpret_cast<ur_event_handle_t>(Event);
4342  HANDLE_ERRORS(urEventRelease(UREvent));
4343 
4344  return PI_SUCCESS;
4345 }
4346 
4347 // Events
4349 
4351 // Sampler
4353  const pi_sampler_properties *SamplerProperties,
4354  pi_sampler *RetSampler) {
4355 
4356  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
4357  PI_ASSERT(RetSampler, PI_ERROR_INVALID_VALUE);
4358 
4359  ur_context_handle_t UrContext =
4360  reinterpret_cast<ur_context_handle_t>(Context);
4361  ur_sampler_desc_t UrProps{};
4362  UrProps.stype = UR_STRUCTURE_TYPE_SAMPLER_DESC;
4363 
4364  const pi_sampler_properties *CurProperty = SamplerProperties;
4365  while (*CurProperty != 0) {
4366  switch (*CurProperty) {
4368  UrProps.normalizedCoords = ur_cast<pi_bool>(*(++CurProperty));
4369  } break;
4370 
4372  pi_sampler_addressing_mode CurValueAddressingMode =
4373  ur_cast<pi_sampler_addressing_mode>(
4374  ur_cast<pi_uint32>(*(++CurProperty)));
4375 
4376  if (CurValueAddressingMode == PI_SAMPLER_ADDRESSING_MODE_MIRRORED_REPEAT)
4377  UrProps.addressingMode = UR_SAMPLER_ADDRESSING_MODE_MIRRORED_REPEAT;
4378  else if (CurValueAddressingMode == PI_SAMPLER_ADDRESSING_MODE_REPEAT)
4379  UrProps.addressingMode = UR_SAMPLER_ADDRESSING_MODE_REPEAT;
4380  else if (CurValueAddressingMode ==
4382  UrProps.addressingMode = UR_SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE;
4383  else if (CurValueAddressingMode == PI_SAMPLER_ADDRESSING_MODE_CLAMP)
4384  UrProps.addressingMode = UR_SAMPLER_ADDRESSING_MODE_CLAMP;
4385  else if (CurValueAddressingMode == PI_SAMPLER_ADDRESSING_MODE_NONE)
4386  UrProps.addressingMode = UR_SAMPLER_ADDRESSING_MODE_NONE;
4387  } break;
4388 
4390  pi_sampler_filter_mode CurValueFilterMode =
4391  ur_cast<pi_sampler_filter_mode>(ur_cast<pi_uint32>(*(++CurProperty)));
4392 
4393  if (CurValueFilterMode == PI_SAMPLER_FILTER_MODE_NEAREST)
4394  UrProps.filterMode = UR_SAMPLER_FILTER_MODE_NEAREST;
4395  else if (CurValueFilterMode == PI_SAMPLER_FILTER_MODE_LINEAR)
4396  UrProps.filterMode = UR_SAMPLER_FILTER_MODE_LINEAR;
4397  } break;
4398 
4399  default:
4400  break;
4401  }
4402  CurProperty++;
4403  }
4404 
4405  ur_sampler_handle_t *UrSampler =
4406  reinterpret_cast<ur_sampler_handle_t *>(RetSampler);
4407 
4408  HANDLE_ERRORS(urSamplerCreate(UrContext, &UrProps, UrSampler));
4409 
4410  return PI_SUCCESS;
4411 }
4412 
4414  size_t ParamValueSize, void *ParamValue,
4415  size_t *ParamValueSizeRet) {
4416  ur_sampler_info_t InfoType{};
4417  switch (ParamName) {
4419  InfoType = UR_SAMPLER_INFO_REFERENCE_COUNT;
4420  break;
4422  InfoType = UR_SAMPLER_INFO_CONTEXT;
4423  break;
4425  InfoType = UR_SAMPLER_INFO_NORMALIZED_COORDS;
4426  break;
4428  InfoType = UR_SAMPLER_INFO_ADDRESSING_MODE;
4429  break;
4431  InfoType = UR_SAMPLER_INFO_FILTER_MODE;
4432  break;
4433  default:
4434  return PI_ERROR_UNKNOWN;
4435  }
4436 
4437  size_t UrParamValueSizeRet;
4438  auto hSampler = reinterpret_cast<ur_sampler_handle_t>(Sampler);
4439  HANDLE_ERRORS(urSamplerGetInfo(hSampler, InfoType, ParamValueSize, ParamValue,
4440  &UrParamValueSizeRet));
4441  if (ParamValueSizeRet) {
4442  *ParamValueSizeRet = UrParamValueSizeRet;
4443  }
4444  ur2piSamplerInfoValue(InfoType, ParamValueSize, &ParamValueSize, ParamValue);
4445  fixupInfoValueTypes(UrParamValueSizeRet, ParamValueSizeRet, ParamValueSize,
4446  ParamValue);
4447  return PI_SUCCESS;
4448 }
4449 
4450 // Special version of piKernelSetArg to accept pi_sampler.
4452  const pi_sampler *ArgValue) {
4453  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
4454  ur_sampler_handle_t UrSampler =
4455  reinterpret_cast<ur_sampler_handle_t>(*ArgValue);
4456 
4457  HANDLE_ERRORS(urKernelSetArgSampler(UrKernel, ArgIndex, nullptr, UrSampler));
4458 
4459  return PI_SUCCESS;
4460 }
4461 
4463  PI_ASSERT(Sampler, PI_ERROR_INVALID_SAMPLER);
4464 
4465  ur_sampler_handle_t UrSampler =
4466  reinterpret_cast<ur_sampler_handle_t>(Sampler);
4467 
4468  HANDLE_ERRORS(urSamplerRetain(UrSampler));
4469 
4470  return PI_SUCCESS;
4471 }
4472 
4474  PI_ASSERT(Sampler, PI_ERROR_INVALID_SAMPLER);
4475 
4476  ur_sampler_handle_t UrSampler =
4477  reinterpret_cast<ur_sampler_handle_t>(Sampler);
4478 
4479  HANDLE_ERRORS(urSamplerRelease(UrSampler));
4480 
4481  return PI_SUCCESS;
4482 }
4483 
4484 // Sampler
4486 
4488 // Command-buffer extension
4489 
4490 inline pi_result
4492  const pi_ext_command_buffer_desc *Desc,
4493  pi_ext_command_buffer *RetCommandBuffer) {
4494  ur_context_handle_t UrContext =
4495  reinterpret_cast<ur_context_handle_t>(Context);
4496  ur_device_handle_t UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
4497  ur_exp_command_buffer_desc_t UrDesc;
4498  UrDesc.stype = UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_DESC;
4499  UrDesc.isUpdatable = Desc->is_updatable;
4500  ur_exp_command_buffer_handle_t *UrCommandBuffer =
4501  reinterpret_cast<ur_exp_command_buffer_handle_t *>(RetCommandBuffer);
4502 
4503  HANDLE_ERRORS(
4504  urCommandBufferCreateExp(UrContext, UrDevice, &UrDesc, UrCommandBuffer));
4505 
4506  return PI_SUCCESS;
4507 }
4508 
4510  ur_exp_command_buffer_handle_t UrCommandBuffer =
4511  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4512 
4513  HANDLE_ERRORS(urCommandBufferRetainExp(UrCommandBuffer));
4514 
4515  return PI_SUCCESS;
4516 }
4517 
4518 inline pi_result
4520  ur_exp_command_buffer_handle_t UrCommandBuffer =
4521  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4522 
4523  HANDLE_ERRORS(urCommandBufferReleaseExp(UrCommandBuffer));
4524 
4525  return PI_SUCCESS;
4526 }
4527 
4528 inline pi_result
4530  ur_exp_command_buffer_handle_t UrCommandBuffer =
4531  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4532 
4533  HANDLE_ERRORS(urCommandBufferFinalizeExp(UrCommandBuffer));
4534 
4535  return PI_SUCCESS;
4536 }
4537 
4539  pi_ext_command_buffer CommandBuffer, pi_kernel Kernel, pi_uint32 WorkDim,
4540  const size_t *GlobalWorkOffset, const size_t *GlobalWorkSize,
4541  const size_t *LocalWorkSize, pi_uint32 NumSyncPointsInWaitList,
4542  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint,
4543  pi_ext_command_buffer_command *Command) {
4544  ur_exp_command_buffer_handle_t UrCommandBuffer =
4545  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4546 
4547  ur_kernel_handle_t UrKernel = reinterpret_cast<ur_kernel_handle_t>(Kernel);
4548  ur_exp_command_buffer_command_handle_t *UrCommandHandle =
4549  reinterpret_cast<ur_exp_command_buffer_command_handle_t *>(Command);
4550  HANDLE_ERRORS(urCommandBufferAppendKernelLaunchExp(
4551  UrCommandBuffer, UrKernel, WorkDim, GlobalWorkOffset, GlobalWorkSize,
4552  LocalWorkSize, NumSyncPointsInWaitList, SyncPointWaitList, SyncPoint,
4553  UrCommandHandle));
4554 
4555  return PI_SUCCESS;
4556 }
4557 
4559  pi_ext_command_buffer CommandBuffer, void *DstPtr, const void *SrcPtr,
4560  size_t Size, pi_uint32 NumSyncPointsInWaitList,
4561  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4562  ur_exp_command_buffer_handle_t UrCommandBuffer =
4563  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4564 
4565  HANDLE_ERRORS(urCommandBufferAppendUSMMemcpyExp(
4566  UrCommandBuffer, DstPtr, SrcPtr, Size, NumSyncPointsInWaitList,
4567  SyncPointWaitList, SyncPoint));
4568 
4569  return PI_SUCCESS;
4570 }
4571 
4573  pi_ext_command_buffer CommandBuffer, pi_mem SrcMem, pi_mem DstMem,
4574  size_t SrcOffset, size_t DstOffset, size_t Size,
4575  pi_uint32 NumSyncPointsInWaitList,
4576  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4577  ur_exp_command_buffer_handle_t UrCommandBuffer =
4578  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4579 
4580  ur_mem_handle_t UrSrcMem = reinterpret_cast<ur_mem_handle_t>(SrcMem);
4581  ur_mem_handle_t UrDstMem = reinterpret_cast<ur_mem_handle_t>(DstMem);
4582 
4583  HANDLE_ERRORS(urCommandBufferAppendMemBufferCopyExp(
4584  UrCommandBuffer, UrSrcMem, UrDstMem, SrcOffset, DstOffset, Size,
4585  NumSyncPointsInWaitList, SyncPointWaitList, SyncPoint));
4586 
4587  return PI_SUCCESS;
4588 }
4589 
4591  pi_ext_command_buffer CommandBuffer, pi_mem SrcMem, pi_mem DstMem,
4592  pi_buff_rect_offset SrcOrigin, pi_buff_rect_offset DstOrigin,
4593  pi_buff_rect_region Region, size_t SrcRowPitch, size_t SrcSlicePitch,
4594  size_t DstRowPitch, size_t DstSlicePitch, pi_uint32 NumSyncPointsInWaitList,
4595  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4596  ur_exp_command_buffer_handle_t UrCommandBuffer =
4597  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4598 
4599  ur_mem_handle_t UrSrcMem = reinterpret_cast<ur_mem_handle_t>(SrcMem);
4600  ur_mem_handle_t UrDstMem = reinterpret_cast<ur_mem_handle_t>(DstMem);
4601 
4602  ur_rect_offset_t UrSrcOrigin{SrcOrigin->x_bytes, SrcOrigin->y_scalar,
4603  SrcOrigin->z_scalar};
4604  ur_rect_offset_t UrDstOrigin{DstOrigin->x_bytes, DstOrigin->y_scalar,
4605  DstOrigin->z_scalar};
4606  ur_rect_region_t UrRegion{};
4607  UrRegion.depth = Region->depth_scalar;
4608  UrRegion.height = Region->height_scalar;
4609  UrRegion.width = Region->width_bytes;
4610 
4611  HANDLE_ERRORS(urCommandBufferAppendMemBufferCopyRectExp(
4612  UrCommandBuffer, UrSrcMem, UrDstMem, UrSrcOrigin, UrDstOrigin, UrRegion,
4613  SrcRowPitch, SrcSlicePitch, DstRowPitch, DstSlicePitch,
4614  NumSyncPointsInWaitList, SyncPointWaitList, SyncPoint));
4615 
4616  return PI_SUCCESS;
4617 }
4618 
4620  pi_ext_command_buffer CommandBuffer, pi_mem Buffer,
4621  pi_buff_rect_offset BufferOffset, pi_buff_rect_offset HostOffset,
4622  pi_buff_rect_region Region, size_t BufferRowPitch, size_t BufferSlicePitch,
4623  size_t HostRowPitch, size_t HostSlicePitch, void *Ptr,
4624  pi_uint32 NumSyncPointsInWaitList,
4625  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4626 
4627  PI_ASSERT(Buffer, PI_ERROR_INVALID_MEM_OBJECT);
4628 
4629  ur_exp_command_buffer_handle_t UrCommandBuffer =
4630  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4631  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
4632  ur_rect_offset_t UrBufferOffset{BufferOffset->x_bytes, BufferOffset->y_scalar,
4633  BufferOffset->z_scalar};
4634  ur_rect_offset_t UrHostOffset{HostOffset->x_bytes, HostOffset->y_scalar,
4635  HostOffset->z_scalar};
4636  ur_rect_region_t UrRegion{};
4637  UrRegion.depth = Region->depth_scalar;
4638  UrRegion.height = Region->height_scalar;
4639  UrRegion.width = Region->width_bytes;
4640 
4641  HANDLE_ERRORS(urCommandBufferAppendMemBufferReadRectExp(
4642  UrCommandBuffer, UrBuffer, UrBufferOffset, UrHostOffset, UrRegion,
4643  BufferRowPitch, BufferSlicePitch, HostRowPitch, HostSlicePitch, Ptr,
4644  NumSyncPointsInWaitList, SyncPointWaitList, SyncPoint));
4645 
4646  return PI_SUCCESS;
4647 }
4648 
4650  pi_ext_command_buffer CommandBuffer, pi_mem Src, size_t Offset, size_t Size,
4651  void *Dst, pi_uint32 NumSyncPointsInWaitList,
4652  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4653  PI_ASSERT(Src, PI_ERROR_INVALID_MEM_OBJECT);
4654 
4655  ur_exp_command_buffer_handle_t UrCommandBuffer =
4656  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4657  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Src);
4658 
4659  HANDLE_ERRORS(urCommandBufferAppendMemBufferReadExp(
4660  UrCommandBuffer, UrBuffer, Offset, Size, Dst, NumSyncPointsInWaitList,
4661  SyncPointWaitList, SyncPoint));
4662 
4663  return PI_SUCCESS;
4664 }
4665 
4667  pi_ext_command_buffer CommandBuffer, pi_mem Buffer,
4668  pi_buff_rect_offset BufferOffset, pi_buff_rect_offset HostOffset,
4669  pi_buff_rect_region Region, size_t BufferRowPitch, size_t BufferSlicePitch,
4670  size_t HostRowPitch, size_t HostSlicePitch, const void *Ptr,
4671  pi_uint32 NumSyncPointsInWaitList,
4672  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4673 
4674  PI_ASSERT(Buffer, PI_ERROR_INVALID_MEM_OBJECT);
4675 
4676  ur_exp_command_buffer_handle_t UrCommandBuffer =
4677  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4678  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
4679  ur_rect_offset_t UrBufferOffset{BufferOffset->x_bytes, BufferOffset->y_scalar,
4680  BufferOffset->z_scalar};
4681  ur_rect_offset_t UrHostOffset{HostOffset->x_bytes, HostOffset->y_scalar,
4682  HostOffset->z_scalar};
4683  ur_rect_region_t UrRegion{};
4684  UrRegion.depth = Region->depth_scalar;
4685  UrRegion.height = Region->height_scalar;
4686  UrRegion.width = Region->width_bytes;
4687 
4688  HANDLE_ERRORS(urCommandBufferAppendMemBufferWriteRectExp(
4689  UrCommandBuffer, UrBuffer, UrBufferOffset, UrHostOffset, UrRegion,
4690  BufferRowPitch, BufferSlicePitch, HostRowPitch, HostSlicePitch,
4691  const_cast<void *>(Ptr), NumSyncPointsInWaitList, SyncPointWaitList,
4692  SyncPoint));
4693 
4694  return PI_SUCCESS;
4695 }
4696 
4698  pi_ext_command_buffer CommandBuffer, pi_mem Buffer, size_t Offset,
4699  size_t Size, const void *Ptr, pi_uint32 NumSyncPointsInWaitList,
4700  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4701 
4702  PI_ASSERT(Buffer, PI_ERROR_INVALID_MEM_OBJECT);
4703 
4704  ur_exp_command_buffer_handle_t UrCommandBuffer =
4705  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4706  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
4707 
4708  HANDLE_ERRORS(urCommandBufferAppendMemBufferWriteExp(
4709  UrCommandBuffer, UrBuffer, Offset, Size, const_cast<void *>(Ptr),
4710  NumSyncPointsInWaitList, SyncPointWaitList, SyncPoint));
4711 
4712  return PI_SUCCESS;
4713 }
4714 
4716  pi_ext_command_buffer CommandBuffer, pi_mem Buffer, const void *Pattern,
4717  size_t PatternSize, size_t Offset, size_t Size,
4718  pi_uint32 NumSyncPointsInWaitList,
4719  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4720  PI_ASSERT(Buffer, PI_ERROR_INVALID_MEM_OBJECT);
4721 
4722  ur_exp_command_buffer_handle_t UrCommandBuffer =
4723  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4724  ur_mem_handle_t UrBuffer = reinterpret_cast<ur_mem_handle_t>(Buffer);
4725 
4726  HANDLE_ERRORS(urCommandBufferAppendMemBufferFillExp(
4727  UrCommandBuffer, UrBuffer, Pattern, PatternSize, Offset, Size,
4728  NumSyncPointsInWaitList, SyncPointWaitList, SyncPoint));
4729  return PI_SUCCESS;
4730 }
4731 
4733  pi_ext_command_buffer CommandBuffer, void *Ptr, const void *Pattern,
4734  size_t PatternSize, size_t Size, pi_uint32 NumSyncPointsInWaitList,
4735  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4736 
4737  ur_exp_command_buffer_handle_t UrCommandBuffer =
4738  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4739 
4740  HANDLE_ERRORS(urCommandBufferAppendUSMFillExp(
4741  UrCommandBuffer, Ptr, Pattern, PatternSize, Size, NumSyncPointsInWaitList,
4742  SyncPointWaitList, SyncPoint));
4743  return PI_SUCCESS;
4744 }
4745 
4747  pi_ext_command_buffer CommandBuffer, const void *Ptr, size_t Size,
4748  pi_usm_migration_flags Flags, pi_uint32 NumSyncPointsInWaitList,
4749  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4750 
4751  // flags is currently unused so fail if set
4752  PI_ASSERT(Flags == 0, PI_ERROR_INVALID_VALUE);
4753 
4754  ur_exp_command_buffer_handle_t UrCommandBuffer =
4755  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4756 
4757  // TODO: to map from pi_usm_migration_flags to
4758  // ur_usm_migration_flags_t
4759  // once we have those defined
4760  ur_usm_migration_flags_t UrFlags{};
4761  HANDLE_ERRORS(urCommandBufferAppendUSMPrefetchExp(
4762  UrCommandBuffer, Ptr, Size, UrFlags, NumSyncPointsInWaitList,
4763  SyncPointWaitList, SyncPoint));
4764  return PI_SUCCESS;
4765 }
4766 
4768  pi_ext_command_buffer CommandBuffer, const void *Ptr, size_t Length,
4769  pi_mem_advice Advice, pi_uint32 NumSyncPointsInWaitList,
4770  const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint) {
4771 
4772  ur_exp_command_buffer_handle_t UrCommandBuffer =
4773  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4774 
4775  ur_usm_advice_flags_t UrAdvice{};
4776  if (Advice & PI_MEM_ADVICE_CUDA_SET_READ_MOSTLY) {
4777  UrAdvice |= UR_USM_ADVICE_FLAG_SET_READ_MOSTLY;
4778  }
4779  if (Advice & PI_MEM_ADVICE_CUDA_UNSET_READ_MOSTLY) {
4780  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_READ_MOSTLY;
4781  }
4783  UrAdvice |= UR_USM_ADVICE_FLAG_SET_PREFERRED_LOCATION;
4784  }
4786  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_PREFERRED_LOCATION;
4787  }
4788  if (Advice & PI_MEM_ADVICE_CUDA_SET_ACCESSED_BY) {
4789  UrAdvice |= UR_USM_ADVICE_FLAG_SET_ACCESSED_BY_DEVICE;
4790  }
4791  if (Advice & PI_MEM_ADVICE_CUDA_UNSET_ACCESSED_BY) {
4792  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_ACCESSED_BY_DEVICE;
4793  }
4795  UrAdvice |= UR_USM_ADVICE_FLAG_SET_ACCESSED_BY_HOST;
4796  }
4798  UrAdvice |= UR_USM_ADVICE_FLAG_CLEAR_ACCESSED_BY_HOST;
4799  }
4800  if (Advice & PI_MEM_ADVICE_RESET) {
4801  UrAdvice |= UR_USM_ADVICE_FLAG_DEFAULT;
4802  }
4803 
4804  HANDLE_ERRORS(urCommandBufferAppendUSMAdviseExp(
4805  UrCommandBuffer, Ptr, Length, UrAdvice, NumSyncPointsInWaitList,
4806  SyncPointWaitList, SyncPoint));
4807  return PI_SUCCESS;
4808 }
4809 
4811  pi_queue Queue,
4812  pi_uint32 NumEventsInWaitList,
4813  const pi_event *EventWaitList,
4814  pi_event *Event) {
4815 
4816  ur_exp_command_buffer_handle_t UrCommandBuffer =
4817  reinterpret_cast<ur_exp_command_buffer_handle_t>(CommandBuffer);
4818 
4819  ur_queue_handle_t UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
4820  const ur_event_handle_t *UrEventWaitList =
4821  reinterpret_cast<const ur_event_handle_t *>(EventWaitList);
4822  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(Event);
4823 
4824  HANDLE_ERRORS(urCommandBufferEnqueueExp(
4825  UrCommandBuffer, UrQueue, NumEventsInWaitList, UrEventWaitList, UREvent));
4826 
4827  return PI_SUCCESS;
4828 }
4829 
4833  ur_exp_command_buffer_command_handle_t UrCommand =
4834  reinterpret_cast<ur_exp_command_buffer_command_handle_t>(command);
4835  ur_exp_command_buffer_update_kernel_launch_desc_t UrDesc;
4836 
4837  UrDesc.stype = ur_structure_type_t::
4838  UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_EXEC_INFO_DESC;
4839  UrDesc.numNewMemObjArgs = desc->num_mem_obj_args;
4840  UrDesc.numNewPointerArgs = desc->num_ptr_args;
4841  UrDesc.numNewValueArgs = desc->num_value_args;
4842  UrDesc.newWorkDim = desc->num_work_dim;
4843 
4844  // Exec info updates are unused and will be removed from UR in future
4845  UrDesc.numNewExecInfos = 0;
4846  UrDesc.pNewExecInfoList = nullptr;
4847 
4848  // Convert arg descs
4849  std::vector<ur_exp_command_buffer_update_memobj_arg_desc_t> UrMemObjDescs;
4850  std::vector<ur_exp_command_buffer_update_pointer_arg_desc_t> UrPointerDescs;
4851  std::vector<ur_exp_command_buffer_update_value_arg_desc_t> UrValueDescs;
4852 
4853  for (size_t i = 0; i < UrDesc.numNewMemObjArgs; i++) {
4854  auto &PiDesc = desc->mem_obj_arg_list[i];
4855  UrMemObjDescs.push_back(
4856  {ur_structure_type_t::
4857  UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_MEMOBJ_ARG_DESC,
4858  nullptr, PiDesc.arg_index, nullptr,
4859  reinterpret_cast<ur_mem_handle_t>(PiDesc.new_mem_obj)});
4860  }
4861  UrDesc.pNewMemObjArgList = UrMemObjDescs.data();
4862 
4863  for (size_t i = 0; i < UrDesc.numNewPointerArgs; i++) {
4864  auto &PiDesc = desc->ptr_arg_list[i];
4865  UrPointerDescs.push_back(
4866  {ur_structure_type_t::
4867  UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_POINTER_ARG_DESC,
4868  nullptr, PiDesc.arg_index, nullptr, PiDesc.new_ptr});
4869  }
4870  UrDesc.pNewPointerArgList = UrPointerDescs.data();
4871 
4872  for (size_t i = 0; i < UrDesc.numNewValueArgs; i++) {
4873  auto &PiDesc = desc->value_arg_list[i];
4874  UrValueDescs.push_back(
4875  {ur_structure_type_t::
4876  UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_VALUE_ARG_DESC,
4877  nullptr, PiDesc.arg_index, PiDesc.arg_size, nullptr,
4878  PiDesc.new_value});
4879  }
4880  UrDesc.pNewValueArgList = UrValueDescs.data();
4881 
4882  UrDesc.pNewGlobalWorkSize = desc->global_work_size;
4883  UrDesc.pNewGlobalWorkOffset = desc->global_work_offset;
4884  UrDesc.pNewLocalWorkSize = desc->local_work_size;
4885 
4886  HANDLE_ERRORS(urCommandBufferUpdateKernelLaunchExp(UrCommand, &UrDesc));
4887 
4888  return PI_SUCCESS;
4889 }
4890 
4891 inline pi_result
4893  ur_exp_command_buffer_command_handle_t UrCommand =
4894  reinterpret_cast<ur_exp_command_buffer_command_handle_t>(command);
4895  HANDLE_ERRORS(urCommandBufferRetainCommandExp(UrCommand));
4896  return PI_SUCCESS;
4897 }
4898 
4899 inline pi_result
4901  ur_exp_command_buffer_command_handle_t UrCommand =
4902  reinterpret_cast<ur_exp_command_buffer_command_handle_t>(command);
4903  HANDLE_ERRORS(urCommandBufferReleaseCommandExp(UrCommand));
4904  return PI_SUCCESS;
4905 }
4906 
4907 // Command-buffer extension
4909 
4911 // usm-p2p
4912 
4914  pi_device peer_device) {
4915  auto commandDevice = reinterpret_cast<ur_device_handle_t>(command_device);
4916  auto peerDevice = reinterpret_cast<ur_device_handle_t>(peer_device);
4917 
4918  HANDLE_ERRORS(urUsmP2PEnablePeerAccessExp(commandDevice, peerDevice));
4919 
4920  return PI_SUCCESS;
4921 }
4922 
4924  pi_device peer_device) {
4925  auto commandDevice = reinterpret_cast<ur_device_handle_t>(command_device);
4926  auto peerDevice = reinterpret_cast<ur_device_handle_t>(peer_device);
4927 
4928  HANDLE_ERRORS(urUsmP2PDisablePeerAccessExp(commandDevice, peerDevice));
4929 
4930  return PI_SUCCESS;
4931 }
4932 
4933 inline pi_result
4934 piextPeerAccessGetInfo(pi_device command_device, pi_device peer_device,
4935  pi_peer_attr attr, size_t param_value_size,
4936  void *param_value, size_t *param_value_size_ret) {
4937  auto commandDevice = reinterpret_cast<ur_device_handle_t>(command_device);
4938  auto peerDevice = reinterpret_cast<ur_device_handle_t>(peer_device);
4939 
4940  ur_exp_peer_info_t propName;
4941  switch (attr) {
4942  case PI_PEER_ACCESS_SUPPORTED: {
4943  propName = UR_EXP_PEER_INFO_UR_PEER_ACCESS_SUPPORTED;
4944  break;
4945  }
4947  propName = UR_EXP_PEER_INFO_UR_PEER_ATOMICS_SUPPORTED;
4948  break;
4949  }
4950  default: {
4951  return PI_ERROR_INVALID_VALUE;
4952  }
4953  }
4954 
4955  HANDLE_ERRORS(urUsmP2PPeerAccessGetInfoExp(
4956  commandDevice, peerDevice, propName, param_value_size, param_value,
4957  param_value_size_ret));
4958 
4959  return PI_SUCCESS;
4960 }
4961 
4962 // usm-p2p
4964 
4966 // Bindless Images Extension
4967 
4969  pi_image_format *ImageFormat,
4970  pi_image_desc *ImageDesc,
4971  pi_image_mem_handle *RetMem) {
4972  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
4973  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
4974 
4975  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
4976  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
4977 
4978  ur_image_format_t UrFormat{};
4979  ur_image_desc_t UrDesc{};
4980  pi2urImageDesc(ImageFormat, ImageDesc, &UrFormat, &UrDesc);
4981 
4982  ur_exp_image_mem_handle_t *UrRetMem =
4983  reinterpret_cast<ur_exp_image_mem_handle_t *>(RetMem);
4984 
4985  HANDLE_ERRORS(urBindlessImagesImageAllocateExp(UrContext, UrDevice, &UrFormat,
4986  &UrDesc, UrRetMem));
4987 
4988  return PI_SUCCESS;
4989 }
4990 
4992  pi_context Context, pi_device Device, pi_image_mem_handle ImgMem,
4993  pi_image_format *ImageFormat, pi_image_desc *ImageDesc, pi_mem *RetMem,
4994  pi_image_handle *RetHandle) {
4995  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
4996  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
4997  PI_ASSERT(RetMem, PI_ERROR_INVALID_MEM_OBJECT);
4998 
4999  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5000  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5001  auto UrImgMem = reinterpret_cast<ur_exp_image_mem_handle_t>(ImgMem);
5002 
5003  ur_image_format_t UrFormat{};
5004  ur_image_desc_t UrDesc{};
5005  pi2urImageDesc(ImageFormat, ImageDesc, &UrFormat, &UrDesc);
5006 
5007  ur_mem_handle_t *UrRetMem = reinterpret_cast<ur_mem_handle_t *>(RetMem);
5008  ur_exp_image_handle_t *UrRetHandle =
5009  reinterpret_cast<ur_exp_image_handle_t *>(RetHandle);
5010 
5011  HANDLE_ERRORS(urBindlessImagesUnsampledImageCreateExp(
5012  UrContext, UrDevice, UrImgMem, &UrFormat, &UrDesc, UrRetMem,
5013  UrRetHandle));
5014 
5015  return PI_SUCCESS;
5016 }
5017 
5019  pi_context Context, pi_device Device, pi_image_mem_handle ImgMem,
5020  pi_image_format *ImageFormat, pi_image_desc *ImageDesc, pi_sampler Sampler,
5021  pi_mem *RetMem, pi_image_handle *RetHandle) {
5022  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5023  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5024  PI_ASSERT(RetMem, PI_ERROR_INVALID_MEM_OBJECT);
5025  PI_ASSERT(Sampler, PI_ERROR_INVALID_SAMPLER);
5026 
5027  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5028  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5029  auto UrImgMem = reinterpret_cast<ur_exp_image_mem_handle_t>(ImgMem);
5030 
5031  ur_image_format_t UrFormat{};
5032  ur_image_desc_t UrDesc{};
5033  pi2urImageDesc(ImageFormat, ImageDesc, &UrFormat, &UrDesc);
5034 
5035  auto UrSampler = reinterpret_cast<ur_sampler_handle_t>(Sampler);
5036  ur_mem_handle_t *UrRetMem = reinterpret_cast<ur_mem_handle_t *>(RetMem);
5037  ur_exp_image_handle_t *UrRetHandle =
5038  reinterpret_cast<ur_exp_image_handle_t *>(RetHandle);
5039 
5040  HANDLE_ERRORS(urBindlessImagesSampledImageCreateExp(
5041  UrContext, UrDevice, UrImgMem, &UrFormat, &UrDesc, UrSampler, UrRetMem,
5042  UrRetHandle));
5043 
5044  return PI_SUCCESS;
5045 }
5046 
5048  pi_context Context, const pi_sampler_properties *SamplerProperties,
5049  float MinMipmapLevelClamp, float MaxMipmapLevelClamp, float MaxAnisotropy,
5050  pi_sampler *RetSampler) {
5051 
5052  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5053  PI_ASSERT(RetSampler, PI_ERROR_INVALID_VALUE);
5054 
5055  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5056  ur_sampler_desc_t UrProps{};
5057  UrProps.stype = UR_STRUCTURE_TYPE_SAMPLER_DESC;
5058 
5059  ur_exp_sampler_mip_properties_t UrMipProps{};
5060  UrMipProps.stype = UR_STRUCTURE_TYPE_EXP_SAMPLER_MIP_PROPERTIES;
5061  UrMipProps.minMipmapLevelClamp = MinMipmapLevelClamp;
5062  UrMipProps.maxMipmapLevelClamp = MaxMipmapLevelClamp;
5063  UrMipProps.maxAnisotropy = MaxAnisotropy;
5064  UrProps.pNext = &UrMipProps;
5065 
5066  ur_exp_sampler_addr_modes_t UrAddrModes{};
5067  UrAddrModes.stype = UR_STRUCTURE_TYPE_EXP_SAMPLER_ADDR_MODES;
5068  UrMipProps.pNext = &UrAddrModes;
5069  int addrIndex = 0;
5070 
5071  ur_exp_sampler_cubemap_properties_t UrCubemapProps{};
5072  UrCubemapProps.stype = UR_STRUCTURE_TYPE_EXP_SAMPLER_CUBEMAP_PROPERTIES;
5073  UrAddrModes.pNext = &UrCubemapProps;
5074 
5075  const pi_sampler_properties *CurProperty = SamplerProperties;
5076  while (*CurProperty != 0) {
5077  switch (*CurProperty) {
5079  UrProps.normalizedCoords = ur_cast<pi_bool>(*(++CurProperty));
5080  } break;
5081 
5083  pi_sampler_addressing_mode CurValueAddressingMode =
5084  ur_cast<pi_sampler_addressing_mode>(
5085  ur_cast<pi_uint32>(*(++CurProperty)));
5086 
5087  if (CurValueAddressingMode ==
5089  UrAddrModes.addrModes[addrIndex] =
5090  UR_SAMPLER_ADDRESSING_MODE_MIRRORED_REPEAT;
5091  } else if (CurValueAddressingMode == PI_SAMPLER_ADDRESSING_MODE_REPEAT) {
5092  UrAddrModes.addrModes[addrIndex] = UR_SAMPLER_ADDRESSING_MODE_REPEAT;
5093  } else if (CurValueAddressingMode ==
5095  UrAddrModes.addrModes[addrIndex] =
5096  UR_SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE;
5097  } else if (CurValueAddressingMode == PI_SAMPLER_ADDRESSING_MODE_CLAMP) {
5098  UrAddrModes.addrModes[addrIndex] = UR_SAMPLER_ADDRESSING_MODE_CLAMP;
5099  } else if (CurValueAddressingMode == PI_SAMPLER_ADDRESSING_MODE_NONE) {
5100  UrAddrModes.addrModes[addrIndex] = UR_SAMPLER_ADDRESSING_MODE_NONE;
5101  }
5102  addrIndex++;
5103  } break;
5104 
5106  pi_sampler_filter_mode CurValueFilterMode =
5107  ur_cast<pi_sampler_filter_mode>(ur_cast<pi_uint32>(*(++CurProperty)));
5108 
5109  if (CurValueFilterMode == PI_SAMPLER_FILTER_MODE_NEAREST)
5110  UrProps.filterMode = UR_SAMPLER_FILTER_MODE_NEAREST;
5111  else if (CurValueFilterMode == PI_SAMPLER_FILTER_MODE_LINEAR)
5112  UrProps.filterMode = UR_SAMPLER_FILTER_MODE_LINEAR;
5113  } break;
5114 
5116  pi_sampler_filter_mode CurValueFilterMode =
5117  ur_cast<pi_sampler_filter_mode>(ur_cast<pi_uint32>(*(++CurProperty)));
5118 
5119  if (CurValueFilterMode == PI_SAMPLER_FILTER_MODE_NEAREST)
5120  UrMipProps.mipFilterMode = UR_SAMPLER_FILTER_MODE_NEAREST;
5121  else if (CurValueFilterMode == PI_SAMPLER_FILTER_MODE_LINEAR)
5122  UrMipProps.mipFilterMode = UR_SAMPLER_FILTER_MODE_LINEAR;
5123  } break;
5124 
5126  pi_sampler_cubemap_filter_mode CurValueFilterMode =
5127  ur_cast<pi_sampler_cubemap_filter_mode>(
5128  ur_cast<pi_uint32>(*(++CurProperty)));
5129 
5130  if (CurValueFilterMode == PI_SAMPLER_CUBEMAP_FILTER_MODE_SEAMLESS)
5131  UrCubemapProps.cubemapFilterMode =
5132  UR_EXP_SAMPLER_CUBEMAP_FILTER_MODE_SEAMLESS;
5133  else if (CurValueFilterMode == PI_SAMPLER_CUBEMAP_FILTER_MODE_DISJOINTED)
5134  UrCubemapProps.cubemapFilterMode =
5135  UR_EXP_SAMPLER_CUBEMAP_FILTER_MODE_DISJOINTED;
5136 
5137  } break;
5138 
5139  default:
5140  break;
5141  }
5142  CurProperty++;
5143  }
5144  UrProps.addressingMode = UrAddrModes.addrModes[0];
5145 
5146  ur_sampler_handle_t *UrSampler =
5147  reinterpret_cast<ur_sampler_handle_t *>(RetSampler);
5148 
5149  HANDLE_ERRORS(urSamplerCreate(UrContext, &UrProps, UrSampler));
5150 
5151  return PI_SUCCESS;
5152 }
5153 
5155  pi_image_mem_handle MipMem,
5156  unsigned int Level,
5157  pi_image_mem_handle *RetMem) {
5158  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5159  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5160 
5161  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5162  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5163  auto UrMipMem = reinterpret_cast<ur_exp_image_mem_handle_t>(MipMem);
5164  ur_exp_image_mem_handle_t *UrRetMem =
5165  reinterpret_cast<ur_exp_image_mem_handle_t *>(RetMem);
5166 
5167  HANDLE_ERRORS(urBindlessImagesMipmapGetLevelExp(UrContext, UrDevice, UrMipMem,
5168  Level, UrRetMem));
5169 
5170  return PI_SUCCESS;
5171 }
5172 
5174  pi_image_mem_handle MemoryHandle) {
5175  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5176  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5177 
5178  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5179  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5180  auto UrMemoryHandle =
5181  reinterpret_cast<ur_exp_image_mem_handle_t>(MemoryHandle);
5182 
5183  HANDLE_ERRORS(
5184  urBindlessImagesImageFreeExp(UrContext, UrDevice, UrMemoryHandle));
5185 
5186  return PI_SUCCESS;
5187 }
5188 
5190  pi_image_mem_handle MemoryHandle) {
5191  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5192  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5193 
5194  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5195  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5196  auto UrMemoryHandle =
5197  reinterpret_cast<ur_exp_image_mem_handle_t>(MemoryHandle);
5198 
5199  HANDLE_ERRORS(
5200  urBindlessImagesMipmapFreeExp(UrContext, UrDevice, UrMemoryHandle));
5201 
5202  return PI_SUCCESS;
5203 }
5204 
5205 static void pi2urImageCopyFlags(const pi_image_copy_flags PiFlags,
5206  ur_exp_image_copy_flags_t *UrFlags) {
5207  switch (PiFlags) {
5209  *UrFlags = UR_EXP_IMAGE_COPY_FLAG_HOST_TO_DEVICE;
5210  break;
5212  *UrFlags = UR_EXP_IMAGE_COPY_FLAG_DEVICE_TO_HOST;
5213  break;
5215  *UrFlags = UR_EXP_IMAGE_COPY_FLAG_DEVICE_TO_DEVICE;
5216  break;
5217  default:
5218  die("pi2urImageCopyFlags: Unsupported use case");
5219  }
5220 }
5221 
5222 inline pi_result
5223 piextMemImageCopy(pi_queue Queue, void *DstPtr, void *SrcPtr,
5224  const pi_image_format *ImageFormat,
5225  const pi_image_desc *ImageDesc,
5226  const pi_image_copy_flags Flags, pi_image_offset SrcOffset,
5227  pi_image_offset DstOffset, pi_image_region CopyExtent,
5228  pi_image_region HostExtent, pi_uint32 NumEventsInWaitList,
5229  const pi_event *EventWaitList, pi_event *Event) {
5230  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
5231 
5232  auto UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
5233 
5234  ur_image_format_t UrFormat{};
5235  ur_image_desc_t UrDesc{};
5236  pi2urImageDesc(ImageFormat, ImageDesc, &UrFormat, &UrDesc);
5237 
5238  ur_exp_image_copy_flags_t UrFlags;
5239  pi2urImageCopyFlags(Flags, &UrFlags);
5240 
5241  ur_rect_offset_t UrSrcOffset{SrcOffset->x, SrcOffset->y, SrcOffset->z};
5242  ur_rect_offset_t UrDstOffset{DstOffset->x, DstOffset->y, DstOffset->z};
5243  ur_rect_region_t UrCopyExtent{};
5244  UrCopyExtent.depth = CopyExtent->depth;
5245  UrCopyExtent.height = CopyExtent->height;
5246  UrCopyExtent.width = CopyExtent->width;
5247  ur_rect_region_t UrHostExtent{};
5248  UrHostExtent.depth = HostExtent->depth;
5249  UrHostExtent.height = HostExtent->height;
5250  UrHostExtent.width = HostExtent->width;
5251 
5252  const ur_event_handle_t *UrEventWaitList =
5253  reinterpret_cast<const ur_event_handle_t *>(EventWaitList);
5254  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(Event);
5255 
5256  HANDLE_ERRORS(urBindlessImagesImageCopyExp(
5257  UrQueue, DstPtr, SrcPtr, &UrFormat, &UrDesc, UrFlags, UrSrcOffset,
5258  UrDstOffset, UrCopyExtent, UrHostExtent, NumEventsInWaitList,
5259  UrEventWaitList, UREvent));
5260 
5261  return PI_SUCCESS;
5262 }
5263 
5265  pi_device Device,
5266  pi_image_handle Handle) {
5267  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5268  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5269 
5270  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5271  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5272  auto UrHandle = reinterpret_cast<ur_exp_image_handle_t>(Handle);
5273 
5274  HANDLE_ERRORS(urBindlessImagesUnsampledImageHandleDestroyExp(
5275  UrContext, UrDevice, UrHandle));
5276 
5277  return PI_SUCCESS;
5278 }
5279 
5281  pi_device Device,
5282  pi_image_handle Handle) {
5283  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5284  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5285 
5286  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5287  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5288  auto UrHandle = reinterpret_cast<ur_exp_image_handle_t>(Handle);
5289 
5290  HANDLE_ERRORS(urBindlessImagesSampledImageHandleDestroyExp(
5291  UrContext, UrDevice, UrHandle));
5292 
5293  return PI_SUCCESS;
5294 }
5295 
5296 static void pi2urImageInfoFlags(const pi_image_info PiFlags,
5297  ur_image_info_t *UrFlags) {
5298  switch (PiFlags) {
5299 #define PI_TO_UR_IMAGE_INFO(FROM, TO) \
5300  case FROM: { \
5301  *UrFlags = TO; \
5302  return; \
5303  }
5304  PI_TO_UR_IMAGE_INFO(PI_IMAGE_INFO_FORMAT, UR_IMAGE_INFO_FORMAT)
5305  PI_TO_UR_IMAGE_INFO(PI_IMAGE_INFO_ELEMENT_SIZE, UR_IMAGE_INFO_ELEMENT_SIZE)
5306  PI_TO_UR_IMAGE_INFO(PI_IMAGE_INFO_ROW_PITCH, UR_IMAGE_INFO_ROW_PITCH)
5307  PI_TO_UR_IMAGE_INFO(PI_IMAGE_INFO_SLICE_PITCH, UR_IMAGE_INFO_SLICE_PITCH)
5308  PI_TO_UR_IMAGE_INFO(PI_IMAGE_INFO_WIDTH, UR_IMAGE_INFO_WIDTH)
5309  PI_TO_UR_IMAGE_INFO(PI_IMAGE_INFO_HEIGHT, UR_IMAGE_INFO_HEIGHT)
5310  PI_TO_UR_IMAGE_INFO(PI_IMAGE_INFO_DEPTH, UR_IMAGE_INFO_DEPTH)
5311 #undef PI_TO_UR_IMAGE_INFO
5312  default:
5313  die("pi2urImageInfoFlags: Unsupported use case");
5314  }
5315 }
5316 
5318  pi_image_info ParamName, void *ParamValue,
5319  size_t *ParamValueSizeRet) {
5320  auto UrMemHandle = reinterpret_cast<ur_exp_image_mem_handle_t>(MemHandle);
5321 
5322  ur_image_info_t UrParamName{};
5323  pi2urImageInfoFlags(ParamName, &UrParamName);
5324 
5325  HANDLE_ERRORS(urBindlessImagesImageGetInfoExp(UrMemHandle, UrParamName,
5326  ParamValue, ParamValueSizeRet));
5327 
5328  if (ParamName == pi_image_info::PI_IMAGE_INFO_FORMAT && ParamValue) {
5329  pi_image_format PiFormat;
5330  ur2piImageFormat(reinterpret_cast<ur_image_format_t *>(ParamValue),
5331  &PiFormat);
5332  reinterpret_cast<pi_image_format *>(ParamValue)->image_channel_data_type =
5333  PiFormat.image_channel_data_type;
5334  reinterpret_cast<pi_image_format *>(ParamValue)->image_channel_order =
5335  PiFormat.image_channel_order;
5336  if (ParamValueSizeRet) {
5337  *ParamValueSizeRet = sizeof(pi_image_format);
5338  }
5339  }
5340 
5341  return PI_SUCCESS;
5342 }
5343 
5345  size_t Size, int FileDescriptor,
5346  pi_interop_mem_handle *RetHandle) {
5347  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5348  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5349 
5350  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5351  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5352  ur_exp_interop_mem_handle_t *UrRetHandle =
5353  reinterpret_cast<ur_exp_interop_mem_handle_t *>(RetHandle);
5354 
5355  ur_exp_file_descriptor_t PosixFD{};
5356  PosixFD.stype = UR_STRUCTURE_TYPE_EXP_FILE_DESCRIPTOR;
5357  PosixFD.fd = FileDescriptor;
5358 
5359  ur_exp_interop_mem_desc_t InteropMemDesc{};
5360  InteropMemDesc.stype = UR_STRUCTURE_TYPE_EXP_INTEROP_MEM_DESC;
5361  InteropMemDesc.pNext = &PosixFD;
5362 
5363  HANDLE_ERRORS(urBindlessImagesImportOpaqueFDExp(
5364  UrContext, UrDevice, Size, &InteropMemDesc, UrRetHandle));
5365 
5366  return PI_SUCCESS;
5367 }
5368 
5370  pi_image_format *ImageFormat,
5371  pi_image_desc *ImageDesc,
5372  pi_interop_mem_handle MemHandle,
5373  pi_image_mem_handle *RetMem) {
5374  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5375  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5376 
5377  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5378  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5379 
5380  ur_image_format_t UrFormat{};
5381  ur_image_desc_t UrDesc{};
5382  pi2urImageDesc(ImageFormat, ImageDesc, &UrFormat, &UrDesc);
5383 
5384  auto UrMemHandle = reinterpret_cast<ur_exp_interop_mem_handle_t>(MemHandle);
5385  ur_exp_image_mem_handle_t *UrRetMem =
5386  reinterpret_cast<ur_exp_image_mem_handle_t *>(RetMem);
5387 
5388  HANDLE_ERRORS(urBindlessImagesMapExternalArrayExp(
5389  UrContext, UrDevice, &UrFormat, &UrDesc, UrMemHandle, UrRetMem));
5390 
5391  return PI_SUCCESS;
5392 }
5393 
5395  pi_interop_mem_handle ExtMem) {
5396  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5397  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5398 
5399  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5400  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5401  auto UrExtMem = reinterpret_cast<ur_exp_interop_mem_handle_t>(ExtMem);
5402 
5403  HANDLE_ERRORS(
5404  urBindlessImagesReleaseInteropExp(UrContext, UrDevice, UrExtMem));
5405 
5406  return PI_SUCCESS;
5407 }
5408 
5409 inline pi_result
5411  int FileDescriptor,
5412  pi_interop_semaphore_handle *RetHandle) {
5413  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5414  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5415 
5416  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5417  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5418  ur_exp_interop_semaphore_handle_t *UrRetHandle =
5419  reinterpret_cast<ur_exp_interop_semaphore_handle_t *>(RetHandle);
5420 
5421  ur_exp_file_descriptor_t PosixFD{};
5422  PosixFD.stype = UR_STRUCTURE_TYPE_EXP_FILE_DESCRIPTOR;
5423  PosixFD.fd = FileDescriptor;
5424 
5425  ur_exp_interop_semaphore_desc_t InteropSemDesc{};
5426  InteropSemDesc.stype = UR_STRUCTURE_TYPE_EXP_INTEROP_SEMAPHORE_DESC;
5427  InteropSemDesc.pNext = &PosixFD;
5428 
5429  HANDLE_ERRORS(urBindlessImagesImportExternalSemaphoreOpaqueFDExp(
5430  UrContext, UrDevice, &InteropSemDesc, UrRetHandle));
5431 
5432  return PI_SUCCESS;
5433 }
5434 
5435 inline pi_result
5437  pi_interop_semaphore_handle SemHandle) {
5438  PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
5439  PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
5440 
5441  auto UrContext = reinterpret_cast<ur_context_handle_t>(Context);
5442  auto UrDevice = reinterpret_cast<ur_device_handle_t>(Device);
5443  auto UrSemHandle =
5444  reinterpret_cast<ur_exp_interop_semaphore_handle_t>(SemHandle);
5445 
5446  HANDLE_ERRORS(urBindlessImagesDestroyExternalSemaphoreExp(UrContext, UrDevice,
5447  UrSemHandle));
5448 
5449  return PI_SUCCESS;
5450 }
5451 
5452 inline pi_result
5454  pi_interop_semaphore_handle SemHandle,
5455  pi_uint32 NumEventsInWaitList,
5456  const pi_event *EventWaitList, pi_event *Event) {
5457  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
5458 
5459  auto UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
5460  auto UrSemHandle =
5461  reinterpret_cast<ur_exp_interop_semaphore_handle_t>(SemHandle);
5462  const ur_event_handle_t *UrEventWaitList =
5463  reinterpret_cast<const ur_event_handle_t *>(EventWaitList);
5464  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(Event);
5465 
5466  HANDLE_ERRORS(urBindlessImagesWaitExternalSemaphoreExp(
5467  UrQueue, UrSemHandle, NumEventsInWaitList, UrEventWaitList, UREvent));
5468 
5469  return PI_SUCCESS;
5470 }
5471 
5472 inline pi_result
5474  pi_interop_semaphore_handle SemHandle,
5475  pi_uint32 NumEventsInWaitList,
5476  const pi_event *EventWaitList, pi_event *Event) {
5477  PI_ASSERT(Queue, PI_ERROR_INVALID_QUEUE);
5478 
5479  auto UrQueue = reinterpret_cast<ur_queue_handle_t>(Queue);
5480  auto UrSemHandle =
5481  reinterpret_cast<ur_exp_interop_semaphore_handle_t>(SemHandle);
5482  const ur_event_handle_t *UrEventWaitList =
5483  reinterpret_cast<const ur_event_handle_t *>(EventWaitList);
5484  ur_event_handle_t *UREvent = reinterpret_cast<ur_event_handle_t *>(Event);
5485 
5486  HANDLE_ERRORS(urBindlessImagesSignalExternalSemaphoreExp(
5487  UrQueue, UrSemHandle, NumEventsInWaitList, UrEventWaitList, UREvent));
5488 
5489  return PI_SUCCESS;
5490 }
5491 
5492 // Bindless Images Extension
5494 
5495 } // namespace pi2ur
pi_result convert(std::function< TypePI(TypeUR)> Func)
Definition: pi2ur.hpp:192
pi_result convertBitSet(std::function< TypePI(TypeUR)> Func)
Definition: pi2ur.hpp:245
pi_result convertArray(std::function< TypePI(TypeUR)> Func)
Definition: pi2ur.hpp:211
pi_result operator()(const T *t, size_t s)
Definition: pi2ur.hpp:176
pi_result operator()(const T &t)
Definition: pi2ur.hpp:172
pi_result operator()(const T *t, size_t s)
Definition: pi2ur.hpp:180
#define __SYCL_PI_CUDA_SYNC_WITH_DEFAULT
#define __SYCL_PI_CUDA_USE_DEFAULT_STREAM
Definition: pi2ur.hpp:783
pi_result piextUSMEnqueueMemset(pi_queue Queue, void *Ptr, pi_int32 Value, size_t Count, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3874
pi_result piEnqueueMemImageFill(pi_queue Queue, pi_mem Image, const void *FillColor, const size_t *Origin, const size_t *Region, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *Event)
Definition: pi2ur.hpp:2141
pi_result piextCommandBufferMemBufferWriteRect(pi_ext_command_buffer CommandBuffer, pi_mem Buffer, pi_buff_rect_offset BufferOffset, pi_buff_rect_offset HostOffset, pi_buff_rect_region Region, size_t BufferRowPitch, size_t BufferSlicePitch, size_t HostRowPitch, size_t HostSlicePitch, const void *Ptr, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4666
pi_result piProgramGetInfo(pi_program Program, pi_program_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:1948
pi_result piextUSMEnqueueFill2D(pi_queue Queue, void *Ptr, size_t Pitch, size_t PatternSize, const void *Pattern, size_t Width, size_t Height, pi_uint32 NumEventsWaitList, const pi_event *EventsWaitList, pi_event *Event)
USM 2D Fill API.
Definition: pi2ur.hpp:3498
pi_result piKernelSetExecInfo(pi_kernel Kernel, pi_kernel_exec_info ParamName, size_t ParamValueSize, const void *ParamValue)
Definition: pi2ur.hpp:2310
pi_result piPlatformGetInfo(pi_platform Platform, pi_platform_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:878
pi_result piQueueCreate(pi_context Context, pi_device Device, pi_queue_properties Flags, pi_queue *Queue)
Definition: pi2ur.hpp:1712
pi_result piextUSMEnqueuePrefetch(pi_queue Queue, const void *Ptr, size_t Size, pi_usm_migration_flags Flags, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Hint to migrate memory to the device.
Definition: pi2ur.hpp:3399
pi_result piextUSMGetMemAllocInfo(pi_context Context, const void *Ptr, pi_mem_alloc_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:3536
pi_result piextSignalExternalSemaphore(pi_queue Queue, pi_interop_semaphore_handle SemHandle, pi_uint32 NumEventsInWaitList, const pi_event *EventWaitList, pi_event *Event)
Definition: pi2ur.hpp:5473
pi_result piKernelGetGroupInfo(pi_kernel Kernel, pi_device Device, pi_kernel_group_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:2443
pi_result piQueueGetInfo(pi_queue Queue, pi_queue_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:1805
pi_result piMemRetain(pi_mem Mem)
Definition: pi2ur.hpp:3370
pi_result piPlatformsGet(pi_uint32 NumEntries, pi_platform *Platforms, pi_uint32 *NumPlatforms)
Definition: pi2ur.hpp:825
pi_result piEnqueueEventsWait(pi_queue Queue, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:4112
pi_result piextEnqueueWriteHostPipe(pi_queue queue, pi_program program, const char *pipe_symbol, pi_bool blocking, void *ptr, size_t size, pi_uint32 num_events_in_waitlist, const pi_event *events_waitlist, pi_event *event)
Definition: pi2ur.hpp:4153
pi_result piextKernelSuggestMaxCooperativeGroupCount(pi_kernel Kernel, size_t LocalWorkSize, size_t DynamicSharedMemorySize, pi_uint32 *GroupCountRet)
Definition: pi2ur.hpp:2632
pi_result piextDestroyExternalSemaphore(pi_context Context, pi_device Device, pi_interop_semaphore_handle SemHandle)
Definition: pi2ur.hpp:5436
pi_result piEnqueueMemUnmap(pi_queue Queue, pi_mem Mem, void *MappedPtr, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3830
pi_result piextDeviceGetNativeHandle(pi_device Device, pi_native_handle *NativeHandle)
Definition: pi2ur.hpp:1318
pi_result piextCommandBufferUpdateKernelLaunch(pi_ext_command_buffer_command command, pi_ext_command_buffer_update_kernel_launch_desc *desc)
Definition: pi2ur.hpp:4830
pi_result piProgramRelease(pi_program Program)
Definition: pi2ur.hpp:2521
pi_result piextCommandBufferPrefetchUSM(pi_ext_command_buffer CommandBuffer, const void *Ptr, size_t Size, pi_usm_migration_flags Flags, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4746
pi_result piEnqueueMemImageWrite(pi_queue Queue, pi_mem Image, pi_bool BlockingWrite, pi_image_offset Origin, pi_image_region Region, size_t InputRowPitch, size_t InputSlicePitch, const void *Ptr, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3742
pi_result piPluginGetBackendOption(pi_platform Platform, const char *FrontendOption, const char **PlatformOption)
Definition: pi2ur.hpp:938
pi_result piextCommandBufferNDRangeKernel(pi_ext_command_buffer CommandBuffer, pi_kernel Kernel, pi_uint32 WorkDim, const size_t *GlobalWorkOffset, const size_t *GlobalWorkSize, const size_t *LocalWorkSize, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint, pi_ext_command_buffer_command *Command)
Definition: pi2ur.hpp:4538
pi_result piextPluginGetOpaqueData(void *opaque_data_param, void **opaque_data_return)
Definition: pi2ur.hpp:931
pi_result piKernelCreate(pi_program Program, const char *KernelName, pi_kernel *RetKernel)
Definition: pi2ur.hpp:2124
pi_result piextUSMImport(const void *HostPtr, size_t Size, pi_context Context)
Definition: pi2ur.hpp:3578
pi_result piEnqueueKernelLaunch(pi_queue Queue, pi_kernel Kernel, pi_uint32 WorkDim, const size_t *GlobalWorkOffset, const size_t *GlobalWorkSize, const size_t *LocalWorkSize, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3693
pi_result piEventSetStatus(pi_event Event, pi_int32 ExecutionStatus)
Definition: pi2ur.hpp:4322
pi_result piEventSetCallback(pi_event Event, pi_int32 CommandExecCallbackType, void(*PFnNotify)(pi_event Event, pi_int32 EventCommandStatus, void *UserData), void *UserData)
Definition: pi2ur.hpp:4309
pi_result piSamplerCreate(pi_context Context, const pi_sampler_properties *SamplerProperties, pi_sampler *RetSampler)
Definition: pi2ur.hpp:4352
pi_result piSamplerGetInfo(pi_sampler Sampler, pi_sampler_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:4413
pi_result piextMemSampledImageCreate(pi_context Context, pi_device Device, pi_image_mem_handle ImgMem, pi_image_format *ImageFormat, pi_image_desc *ImageDesc, pi_sampler Sampler, pi_mem *RetMem, pi_image_handle *RetHandle)
Definition: pi2ur.hpp:5018
pi_result piextMemUnsampledImageHandleDestroy(pi_context Context, pi_device Device, pi_image_handle Handle)
Definition: pi2ur.hpp:5264
pi_result piextKernelSetArgSampler(pi_kernel Kernel, pi_uint32 ArgIndex, const pi_sampler *ArgValue)
Definition: pi2ur.hpp:4451
pi_result piextQueueCreateWithNativeHandle(pi_native_handle NativeHandle, int32_t NativeHandleDesc, pi_context Context, pi_device Device, bool OwnNativeHandle, pi_queue_properties *Properties, pi_queue *Queue)
Definition: pi2ur.hpp:1718
pi_result piMemImageGetInfo(pi_mem Image, pi_image_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:3601
pi_result piextCommandBufferMemBufferWrite(pi_ext_command_buffer CommandBuffer, pi_mem Buffer, size_t Offset, size_t Size, const void *Ptr, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4697
pi_result piextMemMapExternalArray(pi_context Context, pi_device Device, pi_image_format *ImageFormat, pi_image_desc *ImageDesc, pi_interop_mem_handle MemHandle, pi_image_mem_handle *RetMem)
Definition: pi2ur.hpp:5369
pi_result piProgramCreateWithBinary(pi_context Context, pi_uint32 NumDevices, const pi_device *DeviceList, const size_t *Lengths, const unsigned char **Binaries, size_t NumMetadataEntries, const pi_device_binary_property *Metadata, pi_int32 *BinaryStatus, pi_program *Program)
Definition: pi2ur.hpp:1902
pi_result piextProgramGetNativeHandle(pi_program Program, pi_native_handle *NativeHandle)
Definition: pi2ur.hpp:2355
pi_result piKernelGetInfo(pi_kernel Kernel, pi_kernel_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:2391
pi_result piextEventGetNativeHandle(pi_event Event, pi_native_handle *NativeHandle)
Definition: pi2ur.hpp:4217
pi_result piEnqueueEventsWaitWithBarrier(pi_queue Queue, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:4093
pi_result piextMemMipmapFree(pi_context Context, pi_device Device, pi_image_mem_handle MemoryHandle)
Definition: pi2ur.hpp:5189
pi_result piextPlatformGetNativeHandle(pi_platform Platform, pi_native_handle *NativeHandle)
Definition: pi2ur.hpp:838
pi_result piSamplerRelease(pi_sampler Sampler)
Definition: pi2ur.hpp:4473
pi_result piMemBufferCreate(pi_context Context, pi_mem_flags Flags, size_t Size, void *HostPtr, pi_mem *RetMem, const pi_mem_properties *properties)
Definition: pi2ur.hpp:2717
pi_result piEnqueueMemBufferWrite(pi_queue Queue, pi_mem Buffer, pi_bool BlockingWrite, size_t Offset, size_t Size, const void *Ptr, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:4011
pi_result piextCommandBufferMemBufferReadRect(pi_ext_command_buffer CommandBuffer, pi_mem Buffer, pi_buff_rect_offset BufferOffset, pi_buff_rect_offset HostOffset, pi_buff_rect_region Region, size_t BufferRowPitch, size_t BufferSlicePitch, size_t HostRowPitch, size_t HostSlicePitch, void *Ptr, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4619
pi_result piDevicesGet(pi_platform Platform, pi_device_type DeviceType, pi_uint32 NumEntries, pi_device *Devices, pi_uint32 *NumDevices)
Definition: pi2ur.hpp:954
pi_result piextEnqueueDeviceGlobalVariableWrite(pi_queue Queue, pi_program Program, const char *Name, pi_bool BlockingWrite, size_t Count, size_t Offset, const void *Src, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
API for writing data from host to a device global variable.
Definition: pi2ur.hpp:2658
pi_result piextEventCreateWithNativeHandle(pi_native_handle NativeHandle, pi_context Context, bool OwnNativeHandle, pi_event *Event)
Definition: pi2ur.hpp:4285
pi_result piEventGetProfilingInfo(pi_event Event, pi_profiling_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:4232
pi_result piKernelRetain(pi_kernel Kernel)
Definition: pi2ur.hpp:2499
pi_result piextKernelSetArgMemObj(pi_kernel Kernel, pi_uint32 ArgIndex, const pi_mem_obj_property *ArgProperties, const pi_mem *ArgValue)
Definition: pi2ur.hpp:2197
pi_result piextQueueGetNativeHandle(pi_queue Queue, pi_native_handle *NativeHandle, int32_t *NativeHandleDesc)
Definition: pi2ur.hpp:1764
static void pi2urImageDesc(const pi_image_format *ImageFormat, const pi_image_desc *ImageDesc, ur_image_format_t *UrFormat, ur_image_desc_t *UrDesc)
Definition: pi2ur.hpp:2848
pi_result piextBindlessImageSamplerCreate(pi_context Context, const pi_sampler_properties *SamplerProperties, float MinMipmapLevelClamp, float MaxMipmapLevelClamp, float MaxAnisotropy, pi_sampler *RetSampler)
Definition: pi2ur.hpp:5047
pi_result piextUSMDeviceAlloc(void **ResultPtr, pi_context Context, pi_device Device, pi_usm_mem_properties *Properties, size_t Size, pi_uint32 Alignment)
Definition: pi2ur.hpp:3244
pi_result piKernelSetArgPointer(pi_kernel Kernel, pi_uint32 ArgIndex, size_t ArgSize, const void *ArgValue)
Definition: pi2ur.hpp:2268
pi_result piProgramGetBuildInfo(pi_program Program, pi_device Device, pi_program_build_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:2578
pi_result piQueueFlush(pi_queue Queue)
Definition: pi2ur.hpp:1866
pi_result piextKernelSetArgPointer(pi_kernel Kernel, pi_uint32 ArgIndex, size_t, const void *ArgValue)
Definition: pi2ur.hpp:2533
static void ur2piImageFormat(const ur_image_format_t *UrFormat, pi_image_format *PiFormat)
Definition: pi2ur.hpp:2972
pi_result piProgramLink(pi_context Context, pi_uint32 NumDevices, const pi_device *DeviceList, const char *Options, pi_uint32 NumInputPrograms, const pi_program *InputPrograms, void(*PFnNotify)(pi_program Program, void *UserData), void *UserData, pi_program *RetProgram)
Definition: pi2ur.hpp:2008
pi_result piSamplerRetain(pi_sampler Sampler)
Definition: pi2ur.hpp:4462
pi_result piextDeviceSelectBinary(pi_device Device, pi_device_binary *Binaries, pi_uint32 NumBinaries, pi_uint32 *SelectedBinaryInd)
Definition: pi2ur.hpp:1440
pi_result piextContextSetExtendedDeleter(pi_context Context, pi_context_extended_deleter Function, void *UserData)
Definition: pi2ur.hpp:1519
pi_result piextCommandBufferMemBufferRead(pi_ext_command_buffer CommandBuffer, pi_mem Src, size_t Offset, size_t Size, void *Dst, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4649
pi_result piextGetDeviceFunctionPointer(pi_device Device, pi_program Program, const char *FunctionName, pi_uint64 *FunctionPointerRet)
Definition: pi2ur.hpp:2160
pi_result piEnqueueMemBufferCopyRect(pi_queue Queue, pi_mem SrcMem, pi_mem DstMem, pi_buff_rect_offset SrcOrigin, pi_buff_rect_offset DstOrigin, pi_buff_rect_region Region, size_t SrcRowPitch, size_t SrcSlicePitch, size_t DstRowPitch, size_t DstSlicePitch, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3898
pi_result piextMemMipmapGetLevel(pi_context Context, pi_device Device, pi_image_mem_handle MipMem, unsigned int Level, pi_image_mem_handle *RetMem)
Definition: pi2ur.hpp:5154
pi_result piGetDeviceAndHostTimer(pi_device Device, uint64_t *DeviceTime, uint64_t *HostTime)
Definition: pi2ur.hpp:1432
pi_result piEventGetInfo(pi_event Event, pi_event_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:4188
pi_result piMemBufferPartition(pi_mem Buffer, pi_mem_flags Flags, pi_buffer_create_type BufferCreateType, void *BufferCreateInfo, pi_mem *RetMem)
Definition: pi2ur.hpp:3130
pi_result piEnqueueMemBufferCopy(pi_queue Queue, pi_mem SrcMem, pi_mem DstMem, size_t SrcOffset, size_t DstOffset, size_t Size, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3932
pi_result piContextCreate(const pi_context_properties *Properties, pi_uint32 NumDevices, const pi_device *Devices, void(*PFnNotify)(const char *ErrInfo, const void *PrivateInfo, size_t CB, void *UserData), void *UserData, pi_context *RetContext)
Definition: pi2ur.hpp:1499
pi_result piextUSMPitchedAlloc(void **ResultPtr, size_t *ResultPitch, pi_context Context, pi_device Device, pi_usm_mem_properties *Properties, size_t WidthInBytes, size_t Height, unsigned int ElementSizeBytes)
Definition: pi2ur.hpp:3278
pi_result piextUSMRelease(const void *HostPtr, pi_context Context)
Definition: pi2ur.hpp:3590
pi_result piEventRelease(pi_event Event)
Definition: pi2ur.hpp:4338
pi_result piKernelGetSubGroupInfo(pi_kernel Kernel, pi_device Device, pi_kernel_sub_group_info ParamName, size_t InputValueSize, const void *InputValue, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:2541
pi_result piQueueRetain(pi_queue Queue)
Definition: pi2ur.hpp:1855
pi_result piextCommandBufferReleaseCommand(pi_ext_command_buffer_command command)
Definition: pi2ur.hpp:4900
pi_result piDeviceRelease(pi_device Device)
Definition: pi2ur.hpp:992
pi_result piContextRetain(pi_context Context)
Definition: pi2ur.hpp:1622
pi_result piextMemImageAllocate(pi_context Context, pi_device Device, pi_image_format *ImageFormat, pi_image_desc *ImageDesc, pi_image_mem_handle *RetMem)
Definition: pi2ur.hpp:4968
pi_result piextUSMHostAlloc(void **ResultPtr, pi_context Context, pi_usm_mem_properties *Properties, size_t Size, pi_uint32 Alignment)
Definition: pi2ur.hpp:2792
pi_result piextCommandBufferRetain(pi_ext_command_buffer CommandBuffer)
Definition: pi2ur.hpp:4509
pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:1017
pi_result piextCommandBufferAdviseUSM(pi_ext_command_buffer CommandBuffer, const void *Ptr, size_t Length, pi_mem_advice Advice, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4767
pi_result piextKernelCreateWithNativeHandle(pi_native_handle NativeHandle, pi_context Context, pi_program Program, bool OwnNativeHandle, pi_kernel *Kernel)
Definition: pi2ur.hpp:2278
pi_result piextMemSampledImageHandleDestroy(pi_context Context, pi_device Device, pi_image_handle Handle)
Definition: pi2ur.hpp:5280
pi_result piEnqueueMemBufferFill(pi_queue Queue, pi_mem Buffer, const void *Pattern, size_t PatternSize, size_t Offset, size_t Size, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3852
pi_result piextDeviceCreateWithNativeHandle(pi_native_handle NativeHandle, pi_platform Platform, pi_device *Device)
Definition: pi2ur.hpp:1332
pi_result piextUSMEnqueueMemcpy2D(pi_queue Queue, pi_bool Blocking, void *DstPtr, size_t DstPitch, const void *SrcPtr, size_t SrcPitch, size_t Width, size_t Height, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
USM 2D Memcpy API.
Definition: pi2ur.hpp:3660
static void pi2urImageInfoFlags(const pi_image_info PiFlags, ur_image_info_t *UrFlags)
Definition: pi2ur.hpp:5296
pi_result piEnqueueMemBufferMap(pi_queue Queue, pi_mem Mem, pi_bool BlockingMap, pi_map_flags MapFlags, size_t Offset, size_t Size, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent, void **RetMap)
Definition: pi2ur.hpp:3797
pi_result piextCommandBufferRetainCommand(pi_ext_command_buffer_command command)
Definition: pi2ur.hpp:4892
pi_result piextEnqueueCommandBuffer(pi_ext_command_buffer CommandBuffer, pi_queue Queue, pi_uint32 NumEventsInWaitList, const pi_event *EventWaitList, pi_event *Event)
Definition: pi2ur.hpp:4810
pi_result piextCommandBufferCreate(pi_context Context, pi_device Device, const pi_ext_command_buffer_desc *Desc, pi_ext_command_buffer *RetCommandBuffer)
Definition: pi2ur.hpp:4491
pi_result piextEnqueueCooperativeKernelLaunch(pi_queue Queue, pi_kernel Kernel, pi_uint32 WorkDim, const size_t *GlobalWorkOffset, const size_t *GlobalWorkSize, const size_t *LocalWorkSize, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3717
pi_result piextUSMEnqueueMemset2D(pi_queue Queue, void *Ptr, size_t Pitch, int Value, size_t Width, size_t Height, pi_uint32 NumEventsWaitList, const pi_event *EventsWaitList, pi_event *Event)
Definition: pi2ur.hpp:3517
pi_result piEnqueueMemImageCopy(pi_queue Queue, pi_mem SrcImage, pi_mem DstImage, pi_image_offset SrcOrigin, pi_image_offset DstOrigin, pi_image_region Region, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3192
pi_result piextMemImageCreateWithNativeHandle(pi_native_handle NativeHandle, pi_context Context, bool OwnNativeHandle, const pi_image_format *ImageFormat, const pi_image_desc *ImageDesc, pi_mem *RetImage)
Definition: pi2ur.hpp:3101
pi_result piextQueueCreate(pi_context Context, pi_device Device, pi_queue_properties *Properties, pi_queue *Queue)
Definition: pi2ur.hpp:1641
pi_result piextProgramCreateWithNativeHandle(pi_native_handle NativeHandle, pi_context Context, bool OwnNativeHandle, pi_program *Program)
Definition: pi2ur.hpp:2371
pi_result piextMemUnsampledImageCreate(pi_context Context, pi_device Device, pi_image_mem_handle ImgMem, pi_image_format *ImageFormat, pi_image_desc *ImageDesc, pi_mem *RetMem, pi_image_handle *RetHandle)
Definition: pi2ur.hpp:4991
pi_result piextUSMFree(pi_context Context, void *Ptr)
Definition: pi2ur.hpp:3363
pi_result piextEnqueueDeviceGlobalVariableRead(pi_queue Queue, pi_program Program, const char *Name, pi_bool BlockingRead, size_t Count, size_t Offset, void *Dst, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
API reading data from a device global variable to host.
Definition: pi2ur.hpp:2690
pi_result piEventCreate(pi_context Context, pi_event *RetEvent)
Definition: pi2ur.hpp:4270
pi_result piextKernelGetNativeHandle(pi_kernel Kernel, pi_native_handle *NativeHandle)
Definition: pi2ur.hpp:2618
pi_result piextMemImageGetInfo(pi_image_mem_handle MemHandle, pi_image_info ParamName, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:5317
pi_result piQueueFinish(pi_queue Queue)
Definition: pi2ur.hpp:1794
pi_result piextCommandBufferMemBufferFill(pi_ext_command_buffer CommandBuffer, pi_mem Buffer, const void *Pattern, size_t PatternSize, size_t Offset, size_t Size, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4715
pi_result piContextRelease(pi_context Context)
Definition: pi2ur.hpp:1630
pi_result piextPlatformCreateWithNativeHandle(pi_native_handle NativeHandle, pi_platform *Platform)
Definition: pi2ur.hpp:855
pi_result piextMemReleaseInterop(pi_context Context, pi_device Device, pi_interop_mem_handle ExtMem)
Definition: pi2ur.hpp:5394
pi_result piKernelSetArg(pi_kernel Kernel, pi_uint32 ArgIndex, size_t ArgSize, const void *ArgValue)
Definition: pi2ur.hpp:2252
pi_result piEventRetain(pi_event Event)
Definition: pi2ur.hpp:4329
pi_result piextContextGetNativeHandle(pi_context Context, pi_native_handle *NativeHandle)
Definition: pi2ur.hpp:1528
pi_result piMemRelease(pi_mem Mem)
Definition: pi2ur.hpp:3380
pi_result piextUSMEnqueueMemcpy(pi_queue Queue, pi_bool Blocking, void *DstPtr, const void *SrcPtr, size_t Size, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3957
pi_result piextCommandBufferFinalize(pi_ext_command_buffer CommandBuffer)
Definition: pi2ur.hpp:4529
static void pi2urImageCopyFlags(const pi_image_copy_flags PiFlags, ur_exp_image_copy_flags_t *UrFlags)
Definition: pi2ur.hpp:5205
pi_result piPluginGetLastError(char **Message)
Definition: pi2ur.hpp:1000
pi_result piEnqueueMemImageRead(pi_queue Queue, pi_mem Image, pi_bool BlockingRead, pi_image_offset Origin, pi_image_region Region, size_t RowPitch, size_t SlicePitch, void *Ptr, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3771
pi_result piKernelRelease(pi_kernel Kernel)
Definition: pi2ur.hpp:2510
pi_result piextMemImageFree(pi_context Context, pi_device Device, pi_image_mem_handle MemoryHandle)
Definition: pi2ur.hpp:5173
pi_result piextContextCreateWithNativeHandle(pi_native_handle NativeHandle, pi_uint32 NumDevices, const pi_device *Devices, bool OwnNativeHandle, pi_context *RetContext)
Definition: pi2ur.hpp:1539
pi_result piextPeerAccessGetInfo(pi_device command_device, pi_device peer_device, pi_peer_attr attr, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
Definition: pi2ur.hpp:4934
pi_result piQueueRelease(pi_queue Queue)
Definition: pi2ur.hpp:1784
pi_result piextWaitExternalSemaphore(pi_queue Queue, pi_interop_semaphore_handle SemHandle, pi_uint32 NumEventsInWaitList, const pi_event *EventWaitList, pi_event *Event)
Definition: pi2ur.hpp:5453
pi_result piextCommandBufferRelease(pi_ext_command_buffer CommandBuffer)
Definition: pi2ur.hpp:4519
pi_result piContextGetInfo(pi_context Context, pi_context_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:1567
pi_result piextCommandBufferMemBufferCopy(pi_ext_command_buffer CommandBuffer, pi_mem SrcMem, pi_mem DstMem, size_t SrcOffset, size_t DstOffset, size_t Size, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4572
pi_result piextCommandBufferFillUSM(pi_ext_command_buffer CommandBuffer, void *Ptr, const void *Pattern, size_t PatternSize, size_t Size, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4732
pi_result piextMemGetNativeHandle(pi_mem Mem, pi_device Dev, pi_native_handle *NativeHandle)
Definition: pi2ur.hpp:3177
pi_result piextGetGlobalVariablePointer(pi_device Device, pi_program Program, const char *GlobalVariableName, size_t *GlobalVariableSize, void **GlobalVariablePointerRet)
Definition: pi2ur.hpp:2179
pi_result piTearDown(void *PluginParameter)
Definition: pi2ur.hpp:785
pi_result piextMemImportOpaqueFD(pi_context Context, pi_device Device, size_t Size, int FileDescriptor, pi_interop_mem_handle *RetHandle)
Definition: pi2ur.hpp:5344
pi_result piextDisablePeerAccess(pi_device command_device, pi_device peer_device)
Definition: pi2ur.hpp:4923
pi_result piextCommandBufferMemBufferCopyRect(pi_ext_command_buffer CommandBuffer, pi_mem SrcMem, pi_mem DstMem, pi_buff_rect_offset SrcOrigin, pi_buff_rect_offset DstOrigin, pi_buff_rect_region Region, size_t SrcRowPitch, size_t SrcSlicePitch, size_t DstRowPitch, size_t DstSlicePitch, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4590
pi_result piextEnablePeerAccess(pi_device command_device, pi_device peer_device)
Definition: pi2ur.hpp:4913
pi_result piDevicePartition(pi_device Device, const pi_device_partition_property *Properties, pi_uint32 NumEntries, pi_device *SubDevices, pi_uint32 *NumSubDevices)
Definition: pi2ur.hpp:1356
pi_result piEnqueueMemBufferReadRect(pi_queue Queue, pi_mem Buffer, pi_bool BlockingRead, pi_buff_rect_offset BufferOffset, pi_buff_rect_offset HostOffset, pi_buff_rect_region Region, size_t BufferRowPitch, size_t BufferSlicePitch, size_t HostRowPitch, size_t HostSlicePitch, void *Ptr, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:4035
pi_result piMemImageCreate(pi_context Context, pi_mem_flags Flags, const pi_image_format *ImageFormat, const pi_image_desc *ImageDesc, void *HostPtr, pi_mem *RetImage)
Definition: pi2ur.hpp:3059
pi_result piProgramBuild(pi_program Program, pi_uint32 NumDevices, const pi_device *DeviceList, const char *Options, void(*PFnNotify)(pi_program Program, void *UserData), void *UserData)
Definition: pi2ur.hpp:2078
pi_result piEnqueueMemBufferWriteRect(pi_queue Queue, pi_mem Buffer, pi_bool BlockingWrite, pi_buff_rect_offset BufferOffset, pi_buff_rect_offset HostOffset, pi_buff_rect_region Region, size_t BufferRowPitch, size_t BufferSlicePitch, size_t HostRowPitch, size_t HostSlicePitch, const void *Ptr, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:3977
pi_result piextEnqueueReadHostPipe(pi_queue queue, pi_program program, const char *pipe_symbol, pi_bool blocking, void *ptr, size_t size, pi_uint32 num_events_in_waitlist, const pi_event *events_waitlist, pi_event *event)
Definition: pi2ur.hpp:4135
pi_result piProgramRetain(pi_program Program)
Definition: pi2ur.hpp:2299
pi_result piextUSMEnqueueMemAdvise(pi_queue Queue, const void *Ptr, size_t Length, pi_mem_advice Advice, pi_event *OutEvent)
USM memadvise API to govern behavior of automatic migration mechanisms.
Definition: pi2ur.hpp:3436
pi_result piextProgramSetSpecializationConstant(pi_program Program, pi_uint32 SpecID, size_t Size, const void *SpecValue)
Definition: pi2ur.hpp:2107
pi_result piextUSMSharedAlloc(void **ResultPtr, pi_context Context, pi_device Device, pi_usm_mem_properties *Properties, size_t Size, pi_uint32 Alignment)
Definition: pi2ur.hpp:3299
pi_result piEnqueueMemBufferRead(pi_queue Queue, pi_mem Src, pi_bool BlockingRead, size_t Offset, size_t Size, void *Dst, pi_uint32 NumEventsInWaitList, const pi_event *EventsWaitList, pi_event *OutEvent)
Definition: pi2ur.hpp:4070
pi_result piProgramCreate(pi_context Context, const void *ILBytes, size_t Length, pi_program *Program)
Definition: pi2ur.hpp:1883
pi_result piEventsWait(pi_uint32 NumEvents, const pi_event *EventsWaitList)
Definition: pi2ur.hpp:4174
pi_result piDeviceRetain(pi_device Device)
Definition: pi2ur.hpp:985
pi_result piextImportExternalSemaphoreOpaqueFD(pi_context Context, pi_device Device, int FileDescriptor, pi_interop_semaphore_handle *RetHandle)
Definition: pi2ur.hpp:5410
pi_result piextCommandBufferMemcpyUSM(pi_ext_command_buffer CommandBuffer, void *DstPtr, const void *SrcPtr, size_t Size, pi_uint32 NumSyncPointsInWaitList, const pi_ext_sync_point *SyncPointWaitList, pi_ext_sync_point *SyncPoint)
Definition: pi2ur.hpp:4558
pi_result piextMemCreateWithNativeHandle(pi_native_handle NativeHandle, pi_context Context, bool OwnNativeHandle, pi_mem *Mem)
Definition: pi2ur.hpp:3223
pi_result piMemGetInfo(pi_mem Mem, pi_mem_info ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Definition: pi2ur.hpp:2822
pi_result piProgramCompile(pi_program Program, pi_uint32 NumDevices, const pi_device *DeviceList, const char *Options, pi_uint32 NumInputHeaders, const pi_program *InputHeaders, const char **HeaderIncludeNames, void(*PFnNotify)(pi_program Program, void *UserData), void *UserData)
Definition: pi2ur.hpp:2040
pi_result piextMemImageCopy(pi_queue Queue, void *DstPtr, void *SrcPtr, const pi_image_format *ImageFormat, const pi_image_desc *ImageDesc, const pi_image_copy_flags Flags, pi_image_offset SrcOffset, pi_image_offset DstOffset, pi_image_region CopyExtent, pi_image_region HostExtent, pi_uint32 NumEventsInWaitList, const pi_event *EventWaitList, pi_event *Event)
Definition: pi2ur.hpp:5223
pi_result PiGetAdapter(ur_adapter_handle_t &adapter)
Definition: pi2ur.hpp:807
void die(const char *Message)
Definition: pi.cpp:526
void memcpy(void *Dst, const void *Src, size_t Size)
Definition: memcpy.hpp:16
pi_result ur2piProgramBuildInfoValue(ur_program_build_info_t ParamName, size_t ParamValueSizePI, size_t *ParamValueSizeUR, void *ParamValue)
Definition: pi2ur.hpp:712
#define PI_TO_UR_MAP_IMAGE_TYPE(FROM, TO)
#define PI_TO_UR_MAP_IMAGE_CHANNEL_TYPE(FROM, TO)
#define PI_ASSERT(condition, error)
Definition: pi2ur.hpp:158
static pi_result ur2piResult(ur_result_t urResult)
Definition: pi2ur.hpp:17
#define UR_TO_PI_MAP_IMAGE_CHANNEL_ORDER(FROM, TO)
#define HANDLE_ERRORS(urCall)
Definition: pi2ur.hpp:163
#define UR_TO_PI_MAP_IMAGE_CHANNEL_TYPE(FROM, TO)
pi_result ur2piDeviceInfoValue(ur_device_info_t ParamName, size_t ParamValueSize, void *ParamValue, size_t *ParamValueSizeRet)
Translate UR device info values to PI info values.
Definition: pi2ur.hpp:349
pi_result ur2piSamplerInfoValue(ur_sampler_info_t ParamName, size_t ParamValueSizePI, size_t *ParamValueSizeUR, void *ParamValue)
Definition: pi2ur.hpp:635
pi_result ur2piPlatformInfoValue(ur_platform_info_t ParamName, size_t ParamValueSizePI, size_t *ParamValueSizeUR, void *ParamValue)
Definition: pi2ur.hpp:291
#define PI_TO_UR_MAP_IMAGE_CHANNEL_ORDER(FROM, TO)
void fixupInfoValueTypes(size_t ParamValueSizeRetUR, size_t *ParamValueSizeRetPI, size_t ParamValueSize, void *ParamValue)
Definition: pi2ur.hpp:274
ur_result_t mapPIMetadataToUR(const pi_device_binary_property *pi_metadata, ur_program_metadata_t *ur_metadata)
Definition: pi2ur.hpp:760
#define PI_TO_UR_MAP_DEVICE_INFO(FROM, TO)
pi_result ur2piUSMAllocInfoValue(ur_usm_alloc_info_t ParamName, size_t ParamValueSizePI, size_t *ParamValueSizeUR, void *ParamValue)
Definition: pi2ur.hpp:684
#define PI_TO_UR_IMAGE_INFO(FROM, TO)
constexpr pi_queue_properties PI_QUEUE_COMPUTE_INDEX
Definition: pi.h:795
_pi_kernel_cache_config
Definition: pi.h:808
@ PI_EXT_KERNEL_EXEC_INFO_CACHE_LARGE_DATA
Definition: pi.h:814
@ PI_EXT_KERNEL_EXEC_INFO_CACHE_DEFAULT
Definition: pi.h:810
@ PI_EXT_KERNEL_EXEC_INFO_CACHE_LARGE_SLM
Definition: pi.h:812
constexpr pi_mem_flags PI_MEM_ACCESS_READ_ONLY
Definition: pi.h:761
constexpr pi_memory_scope_capabilities PI_MEMORY_SCOPE_WORK_GROUP
Definition: pi.h:743
int32_t pi_int32
Definition: pi.h:212
constexpr pi_sampler_properties PI_SAMPLER_PROPERTIES_NORMALIZED_COORDS
Definition: pi.h:725
constexpr pi_memory_scope_capabilities PI_MEMORY_SCOPE_WORK_ITEM
Definition: pi.h:741
constexpr pi_usm_mem_properties PI_MEM_ALLOC_INITIAL_PLACEMENT_DEVICE
Definition: pi.h:783
uintptr_t pi_native_handle
Definition: pi.h:217
pi_bitfield pi_map_flags
Definition: pi.h:768
static constexpr pi_device_affinity_domain PI_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE
Definition: pi.h:878
_pi_result
Definition: pi.h:224
constexpr pi_sampler_properties PI_SAMPLER_PROPERTIES_ADDRESSING_MODE
Definition: pi.h:727
pi_uint32 pi_bool
Definition: pi.h:215
static constexpr pi_device_partition_property PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE
Definition: pi.h:863
constexpr pi_usm_mem_properties PI_MEM_USM_ALLOC_BUFFER_LOCATION
Definition: pi.h:789
constexpr pi_queue_properties PI_EXT_QUEUE_FLAG_SUBMISSION_IMMEDIATE
Definition: pi.h:805
pi_bitfield pi_usm_mem_properties
Definition: pi.h:780
_pi_device_info
Definition: pi.h:304
@ PI_DEVICE_INFO_PRINTF_BUFFER_SIZE
Definition: pi.h:374
@ PI_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_CHAR
Definition: pi.h:315
@ PI_EXT_ONEAPI_DEVICE_INFO_MAX_IMAGE_LINEAR_WIDTH
Definition: pi.h:440
@ PI_DEVICE_INFO_MAX_MEM_BANDWIDTH
Definition: pi.h:400
@ PI_DEVICE_INFO_GPU_SLICES
Definition: pi.h:397
@ PI_DEVICE_INFO_PREFERRED_INTEROP_USER_SYNC
Definition: pi.h:375
@ PI_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT
Definition: pi.h:326
@ PI_DEVICE_INFO_BUILD_ON_SUBDEVICE
Definition: pi.h:403
@ PI_EXT_ONEAPI_DEVICE_INFO_INTEROP_MEMORY_IMPORT_SUPPORT
Definition: pi.h:447
@ PI_DEVICE_INFO_MAX_WORK_GROUP_SIZE
Definition: pi.h:310
@ PI_DEVICE_INFO_IMAGE_SRGB
Definition: pi.h:401
@ PI_EXT_ONEAPI_DEVICE_INFO_CUBEMAP_SUPPORT
Definition: pi.h:463
@ PI_DEVICE_INFO_IMAGE3D_MAX_WIDTH
Definition: pi.h:337
@ PI_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_SHORT
Definition: pi.h:316
@ PI_DEVICE_INFO_IMAGE3D_MAX_HEIGHT
Definition: pi.h:338
@ PI_DEVICE_INFO_MAX_CLOCK_FREQUENCY
Definition: pi.h:329
@ PI_DEVICE_INFO_USM_SINGLE_SHARED_SUPPORT
Definition: pi.h:386
@ PI_DEVICE_INFO_MAX_WORK_ITEM_DIMENSIONS
Definition: pi.h:308
@ PI_DEVICE_INFO_EXECUTION_CAPABILITIES
Definition: pi.h:360
@ PI_EXT_ONEAPI_DEVICE_INFO_COMMAND_BUFFER_UPDATE_SUPPORT
Definition: pi.h:460
@ PI_EXT_INTEL_DEVICE_INFO_ESIMD_SUPPORT
Definition: pi.h:432
@ PI_DEVICE_INFO_QUEUE_PROPERTIES
Definition: pi.h:314
@ PI_DEVICE_INFO_GPU_EU_COUNT
Definition: pi.h:395
@ PI_DEVICE_INFO_COMPILER_AVAILABLE
Definition: pi.h:358
@ PI_EXT_ONEAPI_DEVICE_INFO_MAX_IMAGE_LINEAR_PITCH
Definition: pi.h:442
@ PI_DEVICE_INFO_IMAGE_SUPPORT
Definition: pi.h:332
@ PI_DEVICE_INFO_ERROR_CORRECTION_SUPPORT
Definition: pi.h:353
@ PI_EXT_INTEL_DEVICE_INFO_FREE_MEMORY
Definition: pi.h:404
@ PI_EXT_ONEAPI_DEVICE_INFO_INTEROP_MEMORY_EXPORT_SUPPORT
Definition: pi.h:448
@ PI_DEVICE_INFO_PARTITION_MAX_SUB_DEVICES
Definition: pi.h:378
@ PI_DEVICE_INFO_BUILT_IN_KERNELS
Definition: pi.h:363
@ PI_DEVICE_INFO_UUID
Definition: pi.h:390
@ PI_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_FLOAT
Definition: pi.h:319
@ PI_EXT_ONEAPI_DEVICE_INFO_MAX_IMAGE_LINEAR_HEIGHT
Definition: pi.h:441
@ PI_DEVICE_INFO_MAX_NUM_SUB_GROUPS
Definition: pi.h:381
@ PI_EXT_ONEAPI_DEVICE_INFO_MIPMAP_SUPPORT
Definition: pi.h:443
@ PI_DEVICE_INFO_AVAILABLE
Definition: pi.h:357
@ PI_DEVICE_INFO_HALF_FP_CONFIG
Definition: pi.h:312
@ PI_EXT_ONEAPI_DEVICE_INFO_MIPMAP_ANISOTROPY_SUPPORT
Definition: pi.h:444
@ PI_DEVICE_INFO_PARENT_DEVICE
Definition: pi.h:376
@ PI_DEVICE_INFO_SUB_GROUP_SIZES_INTEL
Definition: pi.h:383
@ PI_DEVICE_INFO_GPU_EU_SIMD_WIDTH
Definition: pi.h:396
@ PI_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT
Definition: pi.h:323
@ PI_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE
Definition: pi.h:327
@ PI_DEVICE_INFO_GLOBAL_MEM_CACHE_TYPE
Definition: pi.h:345
@ PI_DEVICE_INFO_DRIVER_VERSION
Definition: pi.h:369
@ PI_DEVICE_INFO_MAX_PARAMETER_SIZE
Definition: pi.h:343
@ PI_DEVICE_INFO_PARTITION_PROPERTIES
Definition: pi.h:377
@ PI_EXT_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES
Definition: pi.h:415
@ PI_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_INT
Definition: pi.h:317
@ PI_DEVICE_INFO_USM_CROSS_SHARED_SUPPORT
Definition: pi.h:387
@ PI_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_HALF
Definition: pi.h:321
@ PI_EXT_ONEAPI_DEVICE_INFO_BINDLESS_IMAGES_SUPPORT
Definition: pi.h:435
@ PI_DEVICE_INFO_VERSION
Definition: pi.h:371
@ PI_EXT_INTEL_DEVICE_INFO_MEM_CHANNEL_SUPPORT
Definition: pi.h:429
@ PI_DEVICE_INFO_IMAGE3D_MAX_DEPTH
Definition: pi.h:339
@ PI_DEVICE_INFO_MAX_COMPUTE_UNITS
Definition: pi.h:307
@ PI_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR
Definition: pi.h:322
@ PI_DEVICE_INFO_IMAGE2D_MAX_HEIGHT
Definition: pi.h:336
@ PI_DEVICE_INFO_VENDOR_ID
Definition: pi.h:306
@ PI_DEVICE_INFO_GLOBAL_MEM_CACHELINE_SIZE
Definition: pi.h:346
@ PI_EXT_DEVICE_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES
Definition: pi.h:428
@ PI_DEVICE_INFO_GPU_HW_THREADS_PER_EU
Definition: pi.h:417
@ PI_DEVICE_INFO_BACKEND_VERSION
Definition: pi.h:418
@ PI_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_LONG
Definition: pi.h:318
@ PI_DEVICE_INFO_PLATFORM
Definition: pi.h:364
@ PI_EXT_ONEAPI_DEVICE_INFO_CUBEMAP_SEAMLESS_FILTERING_SUPPORT
Definition: pi.h:464
@ PI_DEVICE_INFO_LOCAL_MEM_SIZE
Definition: pi.h:352
@ PI_DEVICE_INFO_REFERENCE_COUNT
Definition: pi.h:365
@ PI_DEVICE_INFO_MAX_SAMPLERS
Definition: pi.h:342
@ PI_DEVICE_INFO_DEVICE_ID
Definition: pi.h:393
@ PI_EXT_ONEAPI_DEVICE_INFO_INTEROP_SEMAPHORE_EXPORT_SUPPORT
Definition: pi.h:450
@ PI_DEVICE_INFO_PROFILE
Definition: pi.h:370
@ PI_DEVICE_INFO_MAX_WORK_ITEM_SIZES
Definition: pi.h:309
@ PI_DEVICE_INFO_EXTENSIONS
Definition: pi.h:373
@ PI_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT
Definition: pi.h:324
@ PI_DEVICE_INFO_HOST_UNIFIED_MEMORY
Definition: pi.h:354
@ PI_DEVICE_INFO_PCI_ADDRESS
Definition: pi.h:394
@ PI_DEVICE_INFO_MAX_MEM_ALLOC_SIZE
Definition: pi.h:331
@ PI_DEVICE_INFO_GLOBAL_MEM_CACHE_SIZE
Definition: pi.h:347
@ PI_DEVICE_INFO_IMAGE_MAX_ARRAY_SIZE
Definition: pi.h:341
@ PI_DEVICE_INFO_LINKER_AVAILABLE
Definition: pi.h:359
@ PI_EXT_ONEAPI_DEVICE_INFO_MAX_WORK_GROUPS_3D
Definition: pi.h:424
@ PI_DEVICE_INFO_ADDRESS_BITS
Definition: pi.h:330
@ PI_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_DOUBLE
Definition: pi.h:320
@ PI_DEVICE_INFO_ATOMIC_64
Definition: pi.h:414
@ PI_DEVICE_INFO_USM_HOST_SUPPORT
Definition: pi.h:384
@ PI_DEVICE_INFO_USM_DEVICE_SUPPORT
Definition: pi.h:385
@ PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES
Definition: pi.h:413
@ PI_DEVICE_INFO_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS
Definition: pi.h:382
@ PI_DEVICE_INFO_GPU_EU_COUNT_PER_SUBSLICE
Definition: pi.h:399
@ PI_EXT_ONEAPI_DEVICE_INFO_MIPMAP_LEVEL_REFERENCE_SUPPORT
Definition: pi.h:446
@ PI_DEVICE_INFO_MAX_WRITE_IMAGE_ARGS
Definition: pi.h:334
@ PI_EXT_DEVICE_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES
Definition: pi.h:416
@ PI_EXT_CODEPLAY_DEVICE_INFO_MAX_REGISTERS_PER_WORK_GROUP
Definition: pi.h:431
@ PI_DEVICE_INFO_IL_VERSION
Definition: pi.h:366
@ PI_DEVICE_INFO_PROFILING_TIMER_RESOLUTION
Definition: pi.h:355
@ PI_DEVICE_INFO_VENDOR
Definition: pi.h:368
@ PI_DEVICE_INFO_MEM_BASE_ADDR_ALIGN
Definition: pi.h:344
@ PI_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG
Definition: pi.h:325
@ PI_DEVICE_INFO_MAX_READ_IMAGE_ARGS
Definition: pi.h:333
@ PI_DEVICE_INFO_PARTITION_AFFINITY_DOMAIN
Definition: pi.h:379
@ PI_DEVICE_INFO_USM_SYSTEM_SHARED_SUPPORT
Definition: pi.h:388
@ PI_DEVICE_INFO_IMAGE_MAX_BUFFER_SIZE
Definition: pi.h:340
@ PI_EXT_INTEL_DEVICE_INFO_MEMORY_CLOCK_RATE
Definition: pi.h:407
@ PI_DEVICE_INFO_DOUBLE_FP_CONFIG
Definition: pi.h:313
@ PI_EXT_ONEAPI_DEVICE_INFO_INTEROP_SEMAPHORE_IMPORT_SUPPORT
Definition: pi.h:449
@ PI_EXT_ONEAPI_DEVICE_INFO_BINDLESS_IMAGES_SHARED_USM_SUPPORT
Definition: pi.h:436
@ PI_EXT_ONEAPI_DEVICE_INFO_BINDLESS_IMAGES_1D_USM_SUPPORT
Definition: pi.h:437
@ PI_EXT_INTEL_DEVICE_INFO_MEMORY_BUS_WIDTH
Definition: pi.h:410
@ PI_DEVICE_INFO_MAX_CONSTANT_BUFFER_SIZE
Definition: pi.h:349
@ PI_DEVICE_INFO_PARTITION_TYPE
Definition: pi.h:380
@ PI_DEVICE_INFO_TYPE
Definition: pi.h:305
@ PI_EXT_ONEAPI_DEVICE_INFO_COMPONENT_DEVICES
Definition: pi.h:455
@ PI_DEVICE_INFO_SINGLE_FP_CONFIG
Definition: pi.h:311
@ PI_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF
Definition: pi.h:328
@ PI_DEVICE_INFO_GLOBAL_MEM_SIZE
Definition: pi.h:348
@ PI_DEVICE_INFO_NAME
Definition: pi.h:367
@ PI_EXT_ONEAPI_DEVICE_INFO_COMPOSITE_DEVICE
Definition: pi.h:456
@ PI_DEVICE_INFO_LOCAL_MEM_TYPE
Definition: pi.h:351
@ PI_DEVICE_INFO_MAX_CONSTANT_ARGS
Definition: pi.h:350
@ PI_EXT_ONEAPI_DEVICE_INFO_MIPMAP_MAX_ANISOTROPY
Definition: pi.h:445
@ PI_EXT_ONEAPI_DEVICE_INFO_BINDLESS_IMAGES_2D_USM_SUPPORT
Definition: pi.h:438
@ PI_EXT_ONEAPI_DEVICE_INFO_COMMAND_BUFFER_SUPPORT
Definition: pi.h:459
@ PI_EXT_DEVICE_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES
Definition: pi.h:427
@ PI_EXT_ONEAPI_DEVICE_INFO_IMAGE_PITCH_ALIGN
Definition: pi.h:439
@ PI_DEVICE_INFO_OPENCL_C_VERSION
Definition: pi.h:372
@ PI_DEVICE_INFO_ENDIAN_LITTLE
Definition: pi.h:356
@ PI_DEVICE_INFO_IMAGE2D_MAX_WIDTH
Definition: pi.h:335
@ PI_DEVICE_INFO_GPU_SUBSLICES_PER_SLICE
Definition: pi.h:398
@ PI_EXT_ONEAPI_DEVICE_INFO_IP_VERSION
Definition: pi.h:392
@ PI_EXT_ONEAPI_DEVICE_INFO_BFLOAT16_MATH_FUNCTIONS
Definition: pi.h:420
pi_uint64 pi_bitfield
Definition: pi.h:216
constexpr pi_mem_flags PI_MEM_FLAGS_HOST_PTR_ALLOC
Definition: pi.h:765
_pi_program_build_status
Definition: pi.h:255
@ PI_PROGRAM_BUILD_STATUS_SUCCESS
Definition: pi.h:258
@ PI_PROGRAM_BUILD_STATUS_ERROR
Definition: pi.h:257
@ PI_PROGRAM_BUILD_STATUS_IN_PROGRESS
Definition: pi.h:259
@ PI_PROGRAM_BUILD_STATUS_NONE
Definition: pi.h:256
constexpr pi_usm_mem_properties PI_MEM_ALLOC_FLAGS
Definition: pi.h:781
_pi_queue_info
Definition: pi.h:496
@ PI_QUEUE_INFO_DEVICE_DEFAULT
Definition: pi.h:499
@ PI_QUEUE_INFO_PROPERTIES
Definition: pi.h:500
@ PI_QUEUE_INFO_DEVICE
Definition: pi.h:498
@ PI_QUEUE_INFO_CONTEXT
Definition: pi.h:497
@ PI_QUEUE_INFO_REFERENCE_COUNT
Definition: pi.h:501
@ PI_QUEUE_INFO_SIZE
Definition: pi.h:502
@ PI_EXT_ONEAPI_QUEUE_INFO_EMPTY
Definition: pi.h:505
_pi_mem_advice
Definition: pi.h:599
@ PI_MEM_ADVICE_CUDA_UNSET_ACCESSED_BY_HOST
Definition: pi.h:611
@ PI_MEM_ADVICE_CUDA_UNSET_READ_MOSTLY
Definition: pi.h:603
@ PI_MEM_ADVICE_CUDA_UNSET_PREFERRED_LOCATION
Definition: pi.h:605
@ PI_MEM_ADVICE_CUDA_SET_READ_MOSTLY
Definition: pi.h:602
@ PI_MEM_ADVICE_RESET
Definition: pi.h:601
@ PI_MEM_ADVICE_HIP_SET_COARSE_GRAINED
Definition: pi.h:612
@ PI_MEM_ADVICE_HIP_UNSET_COARSE_GRAINED
Definition: pi.h:613
@ PI_MEM_ADVICE_CUDA_UNSET_ACCESSED_BY
Definition: pi.h:607
@ PI_MEM_ADVICE_CUDA_SET_ACCESSED_BY_HOST
Definition: pi.h:610
@ PI_MEM_ADVICE_CUDA_SET_PREFERRED_LOCATION
Definition: pi.h:604
@ PI_MEM_ADVICE_CUDA_SET_ACCESSED_BY
Definition: pi.h:606
@ PI_IMAGE_CHANNEL_TYPE_FLOAT
Definition: pi.h:673
@ PI_IMAGE_CHANNEL_TYPE_UNORM_SHORT_565
Definition: pi.h:663
@ PI_IMAGE_CHANNEL_TYPE_UNORM_INT8
Definition: pi.h:661
@ PI_IMAGE_CHANNEL_TYPE_SIGNED_INT16
Definition: pi.h:667
@ PI_IMAGE_CHANNEL_TYPE_SNORM_INT16
Definition: pi.h:660
@ PI_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8
Definition: pi.h:669
@ PI_IMAGE_CHANNEL_TYPE_SIGNED_INT8
Definition: pi.h:666
@ PI_IMAGE_CHANNEL_TYPE_UNORM_INT_101010
Definition: pi.h:665
@ PI_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32
Definition: pi.h:671
@ PI_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16
Definition: pi.h:670
@ PI_IMAGE_CHANNEL_TYPE_SNORM_INT8
Definition: pi.h:659
@ PI_IMAGE_CHANNEL_TYPE_UNORM_SHORT_555
Definition: pi.h:664
@ PI_IMAGE_CHANNEL_TYPE_SIGNED_INT32
Definition: pi.h:668
@ PI_IMAGE_CHANNEL_TYPE_HALF_FLOAT
Definition: pi.h:672
@ PI_IMAGE_CHANNEL_TYPE_UNORM_INT16
Definition: pi.h:662
_pi_kernel_sub_group_info
Definition: pi.h:538
@ PI_KERNEL_COMPILE_NUM_SUB_GROUPS
Definition: pi.h:541
@ PI_KERNEL_MAX_NUM_SUB_GROUPS
Definition: pi.h:540
@ PI_KERNEL_COMPILE_SUB_GROUP_SIZE_INTEL
Definition: pi.h:542
@ PI_KERNEL_MAX_SUB_GROUP_SIZE
Definition: pi.h:539
pi_bitfield pi_mem_properties
Definition: pi.h:774
_pi_image_format pi_image_format
Definition: pi.h:1180
_pi_kernel_group_info
Definition: pi.h:517
@ PI_KERNEL_GROUP_INFO_WORK_GROUP_SIZE
Definition: pi.h:519
@ PI_KERNEL_GROUP_INFO_COMPILE_WORK_GROUP_SIZE
Definition: pi.h:520
@ PI_KERNEL_GROUP_INFO_GLOBAL_WORK_SIZE
Definition: pi.h:518
@ PI_KERNEL_GROUP_INFO_PRIVATE_MEM_SIZE
Definition: pi.h:523
@ PI_KERNEL_GROUP_INFO_LOCAL_MEM_SIZE
Definition: pi.h:521
@ PI_KERNEL_GROUP_INFO_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
Definition: pi.h:522
@ PI_KERNEL_GROUP_INFO_NUM_REGS
Definition: pi.h:525
constexpr pi_queue_properties PI_EXT_QUEUE_FLAG_SUBMISSION_NO_IMMEDIATE
Definition: pi.h:804
constexpr pi_memory_order_capabilities PI_MEMORY_ORDER_ACQUIRE
Definition: pi.h:735
pi_uint64 pi_image_handle
Definition: pi.h:1157
_pi_ext_command_buffer_command * pi_ext_command_buffer_command
Definition: pi.h:2351
@ PI_PROPERTY_TYPE_UINT32
Definition: pi.h:911
@ PI_PROPERTY_TYPE_BYTE_ARRAY
Definition: pi.h:912
@ PI_PROPERTY_TYPE_STRING
Definition: pi.h:913
_pi_kernel_exec_info
Definition: pi.h:1601
@ PI_USM_INDIRECT_ACCESS
indicates that the kernel might access data through USM ptrs
Definition: pi.h:1603
@ PI_EXT_KERNEL_EXEC_INFO_CACHE_CONFIG
provides the preferred cache configuration (large slm or large data)
Definition: pi.h:1607
@ PI_USM_PTRS
provides an explicit list of pointers that the kernel will access
Definition: pi.h:1605
_pi_platform_info
Definition: pi.h:239
@ PI_PLATFORM_INFO_VENDOR
Definition: pi.h:243
@ PI_PLATFORM_INFO_EXTENSIONS
Definition: pi.h:240
@ PI_PLATFORM_INFO_PROFILE
Definition: pi.h:242
@ PI_EXT_PLATFORM_INFO_BACKEND
Definition: pi.h:245
@ PI_PLATFORM_INFO_NAME
Definition: pi.h:241
@ PI_PLATFORM_INFO_VERSION
Definition: pi.h:244
pi_buffer_region_struct * pi_buffer_region
Definition: pi.h:1078
static constexpr pi_device_partition_property PI_DEVICE_PARTITION_BY_COUNTS
Definition: pi.h:856
constexpr pi_queue_properties PI_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE
Definition: pi.h:797
#define __SYCL_PI_DEVICE_BINARY_TARGET_NATIVE_CPU
Definition: pi.h:976
_pi_image_info
Definition: pi.h:528
@ PI_IMAGE_INFO_HEIGHT
Definition: pi.h:534
@ PI_IMAGE_INFO_SLICE_PITCH
Definition: pi.h:532
@ PI_IMAGE_INFO_ROW_PITCH
Definition: pi.h:531
@ PI_IMAGE_INFO_WIDTH
Definition: pi.h:533
@ PI_IMAGE_INFO_FORMAT
Definition: pi.h:529
@ PI_IMAGE_INFO_ELEMENT_SIZE
Definition: pi.h:530
@ PI_IMAGE_INFO_DEPTH
Definition: pi.h:535
pi_uint32 pi_ext_sync_point
Definition: pi.h:2352
@ PI_IMAGE_CHANNEL_ORDER_RGB
Definition: pi.h:645
@ PI_IMAGE_CHANNEL_ORDER_RA
Definition: pi.h:644
@ PI_IMAGE_CHANNEL_ORDER_RGBA
Definition: pi.h:646
@ PI_IMAGE_CHANNEL_ORDER_INTENSITY
Definition: pi.h:650
@ PI_IMAGE_CHANNEL_ORDER_R
Definition: pi.h:642
@ PI_IMAGE_CHANNEL_ORDER_ABGR
Definition: pi.h:649
@ PI_IMAGE_CHANNEL_ORDER_RGBx
Definition: pi.h:654
@ PI_IMAGE_CHANNEL_ORDER_RG
Definition: pi.h:643
@ PI_IMAGE_CHANNEL_ORDER_BGRA
Definition: pi.h:647
@ PI_IMAGE_CHANNEL_ORDER_Rx
Definition: pi.h:652
@ PI_IMAGE_CHANNEL_ORDER_A
Definition: pi.h:641
@ PI_IMAGE_CHANNEL_ORDER_sRGBA
Definition: pi.h:655
@ PI_IMAGE_CHANNEL_ORDER_LUMINANCE
Definition: pi.h:651
@ PI_IMAGE_CHANNEL_ORDER_RGx
Definition: pi.h:653
@ PI_IMAGE_CHANNEL_ORDER_ARGB
Definition: pi.h:648
constexpr pi_memory_order_capabilities PI_MEMORY_ORDER_ACQ_REL
Definition: pi.h:737
_pi_profiling_info
Definition: pi.h:747
@ PI_PROFILING_INFO_COMMAND_END
Definition: pi.h:751
@ PI_PROFILING_INFO_COMMAND_START
Definition: pi.h:750
@ PI_PROFILING_INFO_COMMAND_SUBMIT
Definition: pi.h:749
@ PI_PROFILING_INFO_COMMAND_QUEUED
Definition: pi.h:748
_pi_usm_type
Definition: pi.h:1965
@ PI_MEM_TYPE_SHARED
Definition: pi.h:1969
@ PI_MEM_TYPE_UNKNOWN
Definition: pi.h:1966
@ PI_MEM_TYPE_DEVICE
Definition: pi.h:1968
@ PI_MEM_TYPE_HOST
Definition: pi.h:1967
_pi_sampler_cubemap_filter_mode
Definition: pi.h:711
@ PI_SAMPLER_CUBEMAP_FILTER_MODE_SEAMLESS
Definition: pi.h:713
@ PI_SAMPLER_CUBEMAP_FILTER_MODE_DISJOINTED
Definition: pi.h:712
_pi_usm_migration_flags
Definition: pi.h:1975
_pi_device_type
Definition: pi.h:272
@ PI_DEVICE_TYPE_ACC
A PI device that is a dedicated accelerator.
Definition: pi.h:278
@ PI_DEVICE_TYPE_ALL
All devices available in the PI plugin.
Definition: pi.h:275
@ PI_DEVICE_TYPE_GPU
A PI device that is a GPU.
Definition: pi.h:277
@ PI_DEVICE_TYPE_CPU
A PI device that is the host processor.
Definition: pi.h:276
static constexpr pi_device_partition_property PI_DEVICE_PARTITION_EQUALLY
Definition: pi.h:854
uint64_t pi_uint64
Definition: pi.h:214
pi_bitfield pi_queue_properties
Definition: pi.h:793
_pi_image_copy_flags
Definition: pi.h:676
@ PI_IMAGE_COPY_DEVICE_TO_DEVICE
Definition: pi.h:679
@ PI_IMAGE_COPY_DEVICE_TO_HOST
Definition: pi.h:678
@ PI_IMAGE_COPY_HOST_TO_DEVICE
Definition: pi.h:677
#define __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64_X86_64
Device-specific binary images produced from SPIR-V 64-bit <-> various "spir64_*" triples for specific...
Definition: pi.h:970
#define __SYCL_PI_DEVICE_BINARY_TARGET_NVPTX64
PTX 64-bit image <-> "nvptx64", 64-bit NVIDIA PTX device.
Definition: pi.h:974
constexpr pi_queue_properties PI_EXT_ONEAPI_QUEUE_FLAG_PRIORITY_LOW
Definition: pi.h:802
constexpr pi_memory_order_capabilities PI_MEMORY_ORDER_RELEASE
Definition: pi.h:736
pi_bitfield pi_sampler_properties
Definition: pi.h:724
constexpr pi_queue_properties PI_QUEUE_FLAG_ON_DEVICE_DEFAULT
Definition: pi.h:800
constexpr pi_queue_properties PI_EXT_ONEAPI_QUEUE_FLAG_DISCARD_EVENTS
Definition: pi.h:801
constexpr pi_queue_properties PI_QUEUE_FLAG_ON_DEVICE
Definition: pi.h:799
constexpr pi_mem_flags PI_MEM_FLAGS_HOST_PTR_COPY
Definition: pi.h:764
_pi_buffer_create_type
Definition: pi.h:682
@ PI_BUFFER_CREATE_TYPE_REGION
Definition: pi.h:682
uint32_t pi_uint32
Definition: pi.h:213
static constexpr pi_device_partition_property PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN
Definition: pi.h:861
constexpr pi_memory_order_capabilities PI_MEMORY_ORDER_RELAXED
Definition: pi.h:734
_pi_event_info
Definition: pi.h:545
@ PI_EVENT_INFO_COMMAND_EXECUTION_STATUS
Definition: pi.h:549
@ PI_EVENT_INFO_REFERENCE_COUNT
Definition: pi.h:550
@ PI_EVENT_INFO_COMMAND_TYPE
Definition: pi.h:548
@ PI_EVENT_INFO_CONTEXT
Definition: pi.h:547
@ PI_EVENT_INFO_COMMAND_QUEUE
Definition: pi.h:546
constexpr pi_queue_properties PI_EXT_ONEAPI_QUEUE_FLAG_PRIORITY_HIGH
Definition: pi.h:803
#define __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64
SPIR-V 64-bit image <-> "spir64", 64-bit OpenCL device.
Definition: pi.h:967
constexpr pi_usm_mem_properties PI_MEM_ALLOC_INITIAL_PLACEMENT_HOST
Definition: pi.h:785
#define __SYCL_PI_DEVICE_BINARY_TARGET_AMDGCN
Definition: pi.h:975
intptr_t pi_context_properties
Definition: pi.h:716
pi_bitfield pi_mem_flags
Definition: pi.h:758
constexpr pi_usm_mem_properties PI_MEM_ALLOC_WRTITE_COMBINED
Definition: pi.h:782
_pi_device * pi_device
Definition: pi.h:1149
constexpr pi_queue_properties PI_QUEUE_FLAGS
Definition: pi.h:794
constexpr pi_queue_properties PI_QUEUE_FLAG_PROFILING_ENABLE
Definition: pi.h:798
constexpr pi_mem_flags PI_MEM_FLAGS_HOST_PTR_USE
Definition: pi.h:763
void(* pi_context_extended_deleter)(void *user_data)
Definition: pi.h:1341
constexpr pi_map_flags PI_MAP_WRITE
Definition: pi.h:770
constexpr pi_map_flags PI_MAP_WRITE_INVALIDATE_REGION
Definition: pi.h:771
@ PI_MEM_TYPE_BUFFER
Definition: pi.h:589
@ PI_MEM_TYPE_IMAGE_CUBEMAP
Definition: pi.h:596
@ PI_MEM_TYPE_IMAGE1D_BUFFER
Definition: pi.h:595
@ PI_MEM_TYPE_IMAGE1D
Definition: pi.h:593
@ PI_MEM_TYPE_IMAGE1D_ARRAY
Definition: pi.h:594
@ PI_MEM_TYPE_IMAGE2D
Definition: pi.h:590
@ PI_MEM_TYPE_IMAGE2D_ARRAY
Definition: pi.h:592
@ PI_MEM_TYPE_IMAGE3D
Definition: pi.h:591
constexpr pi_usm_mem_properties PI_MEM_ALLOC_DEVICE_READ_ONLY
Definition: pi.h:787
_pi_sampler_info
Definition: pi.h:687
@ PI_SAMPLER_INFO_CONTEXT
Definition: pi.h:689
@ PI_SAMPLER_INFO_NORMALIZED_COORDS
Definition: pi.h:690
@ PI_SAMPLER_INFO_FILTER_MODE
Definition: pi.h:692
@ PI_SAMPLER_INFO_REFERENCE_COUNT
Definition: pi.h:688
@ PI_SAMPLER_INFO_ADDRESSING_MODE
Definition: pi.h:691
constexpr pi_map_flags PI_MAP_READ
Definition: pi.h:769
static constexpr pi_device_affinity_domain PI_DEVICE_AFFINITY_DOMAIN_NUMA
Definition: pi.h:867
pi_bitfield pi_memory_scope_capabilities
Definition: pi.h:740
#define __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64_GEN
Definition: pi.h:971
pi_bitfield pi_device_fp_config
Definition: pi.h:881
constexpr pi_sampler_properties PI_SAMPLER_PROPERTIES_FILTER_MODE
Definition: pi.h:728
constexpr pi_mem_flags PI_MEM_FLAGS_ACCESS_RW
Definition: pi.h:760
@ PI_ACCESS_READ_WRITE
Definition: pi.h:1904
@ PI_ACCESS_READ_ONLY
Definition: pi.h:1906
@ PI_ACCESS_WRITE_ONLY
Definition: pi.h:1905
_pi_kernel_info
Definition: pi.h:508
@ PI_KERNEL_INFO_PROGRAM
Definition: pi.h:513
@ PI_KERNEL_INFO_FUNCTION_NAME
Definition: pi.h:509
@ PI_KERNEL_INFO_REFERENCE_COUNT
Definition: pi.h:511
@ PI_KERNEL_INFO_CONTEXT
Definition: pi.h:512
@ PI_KERNEL_INFO_ATTRIBUTES
Definition: pi.h:514
@ PI_KERNEL_INFO_NUM_ARGS
Definition: pi.h:510
#define __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV32
SPIR-V 32-bit image <-> "spir", 32-bit OpenCL device.
Definition: pi.h:965
constexpr pi_device_exec_capabilities PI_DEVICE_EXEC_CAPABILITIES_NATIVE_KERNEL
Definition: pi.h:722
constexpr pi_memory_scope_capabilities PI_MEMORY_SCOPE_DEVICE
Definition: pi.h:744
constexpr pi_sampler_properties PI_SAMPLER_PROPERTIES_CUBEMAP_FILTER_MODE
Definition: pi.h:730
#define __SYCL_PI_DEVICE_BINARY_TARGET_UNKNOWN
Target identification strings for pi_device_binary_struct.DeviceTargetSpec.
Definition: pi.h:963
_pi_mem_alloc_info
Definition: pi.h:1958
@ PI_MEM_ALLOC_BASE_PTR
Definition: pi.h:1960
@ PI_MEM_ALLOC_TYPE
Definition: pi.h:1959
@ PI_MEM_ALLOC_DEVICE
Definition: pi.h:1962
@ PI_MEM_ALLOC_SIZE
Definition: pi.h:1961
_pi_device_local_mem_type
Definition: pi.h:299
@ PI_DEVICE_LOCAL_MEM_TYPE_GLOBAL
Definition: pi.h:301
@ PI_DEVICE_LOCAL_MEM_TYPE_LOCAL
Definition: pi.h:300
constexpr pi_memory_scope_capabilities PI_MEMORY_SCOPE_SYSTEM
Definition: pi.h:745
constexpr pi_memory_scope_capabilities PI_MEMORY_SCOPE_SUB_GROUP
Definition: pi.h:742
_pi_context_info
Definition: pi.h:479
@ PI_EXT_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES
Definition: pi.h:486
@ PI_CONTEXT_INFO_NUM_DEVICES
Definition: pi.h:482
@ PI_EXT_ONEAPI_CONTEXT_INFO_USM_MEMSET2D_SUPPORT
Definition: pi.h:492
@ PI_EXT_ONEAPI_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT
Definition: pi.h:493
@ PI_EXT_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES
Definition: pi.h:488
@ PI_CONTEXT_INFO_DEVICES
Definition: pi.h:480
@ PI_CONTEXT_INFO_REFERENCE_COUNT
Definition: pi.h:484
@ PI_EXT_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES
Definition: pi.h:489
@ PI_EXT_ONEAPI_CONTEXT_INFO_USM_FILL2D_SUPPORT
Definition: pi.h:491
@ PI_EXT_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES
Definition: pi.h:487
_pi_sampler_filter_mode
Definition: pi.h:706
@ PI_SAMPLER_FILTER_MODE_NEAREST
Definition: pi.h:707
@ PI_SAMPLER_FILTER_MODE_LINEAR
Definition: pi.h:708
constexpr pi_mem_properties PI_MEM_PROPERTIES_ALLOC_BUFFER_LOCATION
Definition: pi.h:776
void * pi_image_mem_handle
Definition: pi.h:1158
_pi_sampler_addressing_mode
Definition: pi.h:698
@ PI_SAMPLER_ADDRESSING_MODE_MIRRORED_REPEAT
Definition: pi.h:699
@ PI_SAMPLER_ADDRESSING_MODE_CLAMP
Definition: pi.h:702
@ PI_SAMPLER_ADDRESSING_MODE_NONE
Definition: pi.h:703
@ PI_SAMPLER_ADDRESSING_MODE_REPEAT
Definition: pi.h:700
@ PI_SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE
Definition: pi.h:701
_pi_platform_backend
Definition: pi.h:283
@ PI_EXT_PLATFORM_BACKEND_OPENCL
The backend is OpenCL.
Definition: pi.h:286
@ PI_EXT_PLATFORM_BACKEND_NATIVE_CPU
The backend is NATIVE_CPU.
Definition: pi.h:290
@ PI_EXT_PLATFORM_BACKEND_UNKNOWN
The backend is not a recognized one.
Definition: pi.h:284
@ PI_EXT_PLATFORM_BACKEND_LEVEL_ZERO
The backend is Level Zero.
Definition: pi.h:285
@ PI_EXT_PLATFORM_BACKEND_HIP
The backend is HIP.
Definition: pi.h:288
@ PI_EXT_PLATFORM_BACKEND_CUDA
The backend is CUDA.
Definition: pi.h:287
_pi_program_info
Definition: pi.h:467
@ PI_PROGRAM_INFO_NUM_DEVICES
Definition: pi.h:470
@ PI_PROGRAM_INFO_SOURCE
Definition: pi.h:472
@ PI_PROGRAM_INFO_BINARY_SIZES
Definition: pi.h:473
@ PI_PROGRAM_INFO_KERNEL_NAMES
Definition: pi.h:476
@ PI_PROGRAM_INFO_CONTEXT
Definition: pi.h:469
@ PI_PROGRAM_INFO_REFERENCE_COUNT
Definition: pi.h:468
@ PI_PROGRAM_INFO_BINARIES
Definition: pi.h:474
@ PI_PROGRAM_INFO_NUM_KERNELS
Definition: pi.h:475
@ PI_PROGRAM_INFO_DEVICES
Definition: pi.h:471
intptr_t pi_device_partition_property
Definition: pi.h:853
constexpr pi_sampler_properties PI_SAMPLER_PROPERTIES_MIP_FILTER_MODE
Definition: pi.h:729
constexpr pi_device_exec_capabilities PI_DEVICE_EXEC_CAPABILITIES_KERNEL
Definition: pi.h:719
constexpr pi_memory_order_capabilities PI_MEMORY_ORDER_SEQ_CST
Definition: pi.h:738
_pi_mem_info
Definition: pi.h:1183
@ PI_MEM_SIZE
Definition: pi.h:1183
@ PI_MEM_CONTEXT
Definition: pi.h:1183
_pi_program_binary_type
Definition: pi.h:262
@ PI_PROGRAM_BINARY_TYPE_LIBRARY
Definition: pi.h:265
@ PI_PROGRAM_BINARY_TYPE_EXECUTABLE
Definition: pi.h:266
@ PI_PROGRAM_BINARY_TYPE_COMPILED_OBJECT
Definition: pi.h:264
@ PI_PROGRAM_BINARY_TYPE_NONE
Definition: pi.h:263
pi_uint64 pi_interop_semaphore_handle
Definition: pi.h:1160
_pi_peer_attr
Definition: pi.h:1185
@ PI_PEER_ACCESS_SUPPORTED
returns a uint32_t: 1 if P2P Access is supported otherwise P2P Access is not supported.
Definition: pi.h:1186
@ PI_PEER_ATOMICS_SUPPORTED
returns a uint32_t: 1 if Atomic operations are supported over the P2P link, otherwise such operations...
Definition: pi.h:1189
pi_bitfield pi_device_affinity_domain
Definition: pi.h:866
pi_uint64 pi_interop_mem_handle
Definition: pi.h:1159
pi_bitfield pi_memory_order_capabilities
Definition: pi.h:733
#define __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64_FPGA
Definition: pi.h:972
@ PI_KERNEL_ARG_MEM_OBJ_ACCESS
Definition: pi.h:1912
constexpr pi_mem_properties PI_MEM_PROPERTIES_CHANNEL
Definition: pi.h:775
_pi_program_build_info
Definition: pi.h:248
@ PI_PROGRAM_BUILD_INFO_LOG
Definition: pi.h:251
@ PI_PROGRAM_BUILD_INFO_OPTIONS
Definition: pi.h:250
@ PI_PROGRAM_BUILD_INFO_BINARY_TYPE
Definition: pi.h:252
@ PI_PROGRAM_BUILD_INFO_STATUS
Definition: pi.h:249
size_t image_slice_pitch
Definition: pi.h:1174
pi_uint32 num_mip_levels
Definition: pi.h:1175
size_t image_height
Definition: pi.h:1170
size_t image_row_pitch
Definition: pi.h:1173
pi_uint32 num_samples
Definition: pi.h:1176
size_t image_depth
Definition: pi.h:1171
size_t image_width
Definition: pi.h:1169
pi_mem_type image_type
Definition: pi.h:1168
size_t image_array_size
Definition: pi.h:1172
pi_image_channel_type image_channel_data_type
Definition: pi.h:1164
pi_image_channel_order image_channel_order
Definition: pi.h:1163
pi_mem_obj_property_type type
Definition: pi.h:1918
pi_mem_access_flag mem_access
Definition: pi.h:1920
void * pNext
Definition: pi.h:1919
This struct is a record of the device binary information.
Definition: pi.h:1025
pi_ext_command_buffer_update_pointer_arg_desc_t * ptr_arg_list
Definition: pi.h:2389
pi_ext_command_buffer_update_memobj_arg_desc_t * mem_obj_arg_list
Definition: pi.h:2388
pi_ext_command_buffer_update_value_arg_desc_t * value_arg_list
Definition: pi.h:2390