@@ -398,11 +398,111 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemImageCreate(
398398 return Result;
399399}
400400
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+ }
406506}
407507
408508// / Implements a buffer partition in the CUDA backend.
0 commit comments