@@ -398,11 +398,111 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemImageCreate(
398
398
return Result;
399
399
}
400
400
401
- // / \TODO Not implemented
402
- UR_APIEXPORT ur_result_t UR_APICALL urMemImageGetInfo (ur_mem_handle_t ,
403
- ur_image_info_t , size_t ,
404
- void *, size_t *) {
405
- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
401
+ UR_APIEXPORT ur_result_t UR_APICALL urMemImageGetInfo (ur_mem_handle_t hMemory,
402
+ ur_image_info_t propName,
403
+ size_t propSize,
404
+ void *pPropValue,
405
+ size_t *pPropSizeRet) {
406
+ UR_ASSERT (hMemory->isImage (), UR_RESULT_ERROR_INVALID_MEM_OBJECT);
407
+
408
+ auto Context = hMemory->getContext ();
409
+
410
+ ScopedContext Active (Context);
411
+ UrReturnHelper ReturnValue (propSize, pPropValue, pPropSizeRet);
412
+
413
+ try {
414
+ CUDA_ARRAY3D_DESCRIPTOR ArrayInfo;
415
+
416
+ UR_CHECK_ERROR (cuArray3DGetDescriptor (
417
+ &ArrayInfo, std::get<SurfaceMem>(hMemory->Mem ).getArray ()));
418
+
419
+ const auto cuda2urFormat = [](CUarray_format CUFormat,
420
+ ur_image_channel_type_t *ChannelType) {
421
+ switch (CUFormat) {
422
+ case CU_AD_FORMAT_UNSIGNED_INT8:
423
+ *ChannelType = UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8;
424
+ break ;
425
+ case CU_AD_FORMAT_UNSIGNED_INT16:
426
+ *ChannelType = UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16;
427
+ break ;
428
+ case CU_AD_FORMAT_UNSIGNED_INT32:
429
+ *ChannelType = UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32;
430
+ break ;
431
+ case CU_AD_FORMAT_SIGNED_INT8:
432
+ *ChannelType = UR_IMAGE_CHANNEL_TYPE_SIGNED_INT8;
433
+ break ;
434
+ case CU_AD_FORMAT_SIGNED_INT16:
435
+ *ChannelType = UR_IMAGE_CHANNEL_TYPE_SIGNED_INT16;
436
+ break ;
437
+ case CU_AD_FORMAT_SIGNED_INT32:
438
+ *ChannelType = UR_IMAGE_CHANNEL_TYPE_SIGNED_INT32;
439
+ break ;
440
+ case CU_AD_FORMAT_HALF:
441
+ *ChannelType = UR_IMAGE_CHANNEL_TYPE_HALF_FLOAT;
442
+ break ;
443
+ case CU_AD_FORMAT_FLOAT:
444
+ *ChannelType = UR_IMAGE_CHANNEL_TYPE_FLOAT;
445
+ break ;
446
+ default :
447
+ return UR_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT;
448
+ }
449
+ return UR_RESULT_SUCCESS;
450
+ };
451
+
452
+ const auto cudaFormatToElementSize = [](CUarray_format CUFormat,
453
+ size_t *Size ) {
454
+ switch (CUFormat) {
455
+ case CU_AD_FORMAT_UNSIGNED_INT8:
456
+ case CU_AD_FORMAT_SIGNED_INT8:
457
+ *Size = 1 ;
458
+ break ;
459
+ case CU_AD_FORMAT_UNSIGNED_INT16:
460
+ case CU_AD_FORMAT_SIGNED_INT16:
461
+ case CU_AD_FORMAT_HALF:
462
+ *Size = 2 ;
463
+ break ;
464
+ case CU_AD_FORMAT_UNSIGNED_INT32:
465
+ case CU_AD_FORMAT_SIGNED_INT32:
466
+ case CU_AD_FORMAT_FLOAT:
467
+ *Size = 4 ;
468
+ break ;
469
+ default :
470
+ return UR_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT;
471
+ }
472
+ return UR_RESULT_SUCCESS;
473
+ };
474
+
475
+ switch (propName) {
476
+ case UR_IMAGE_INFO_FORMAT: {
477
+ ur_image_channel_type_t ChannelType{};
478
+ UR_CHECK_ERROR (cuda2urFormat (ArrayInfo.Format , &ChannelType));
479
+ return ReturnValue (
480
+ ur_image_format_t {UR_IMAGE_CHANNEL_ORDER_RGBA, ChannelType});
481
+ }
482
+ case UR_IMAGE_INFO_WIDTH:
483
+ return ReturnValue (ArrayInfo.Width );
484
+ case UR_IMAGE_INFO_HEIGHT:
485
+ return ReturnValue (ArrayInfo.Height );
486
+ case UR_IMAGE_INFO_DEPTH:
487
+ return ReturnValue (ArrayInfo.Depth );
488
+ case UR_IMAGE_INFO_ELEMENT_SIZE: {
489
+ size_t Size = 0 ;
490
+ UR_CHECK_ERROR (cudaFormatToElementSize (ArrayInfo.Format , &Size ));
491
+ return ReturnValue (Size );
492
+ }
493
+ case UR_IMAGE_INFO_ROW_PITCH:
494
+ case UR_IMAGE_INFO_SLICE_PITCH:
495
+ return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
496
+
497
+ default :
498
+ return UR_RESULT_ERROR_INVALID_ENUMERATION;
499
+ }
500
+
501
+ } catch (ur_result_t Err) {
502
+ return Err;
503
+ } catch (...) {
504
+ return UR_RESULT_ERROR_UNKNOWN;
505
+ }
406
506
}
407
507
408
508
// / Implements a buffer partition in the CUDA backend.
0 commit comments