@@ -29,24 +29,6 @@ zeMemGetPitchFor2dImage_pfn zeMemGetPitchFor2dImageFunctionPtr = nullptr;
29
29
30
30
zeImageGetDeviceOffsetExp_pfn zeImageGetDeviceOffsetExpFunctionPtr = nullptr ;
31
31
32
- // / Return true if the two image_desc are the same.
33
- bool isSameImageDesc (const ze_image_desc_t *Desc1,
34
- const ze_image_desc_t *Desc2) {
35
- auto IsSameImageFormat = [](const ze_image_format_t &Format1,
36
- const ze_image_format_t &Format2) {
37
- return Format1.layout == Format2.layout && Format1.type == Format2.type &&
38
- Format1.x == Format2.x && Format1.y == Format2.y &&
39
- Format1.z == Format2.z && Format1.w == Format2.w ;
40
- };
41
- return Desc1->stype == Desc2->stype && Desc1->flags == Desc2->flags &&
42
- Desc1->type == Desc2->type &&
43
- IsSameImageFormat (Desc1->format , Desc2->format ) &&
44
- Desc1->width == Desc2->width && Desc1->height == Desc2->height &&
45
- Desc1->depth == Desc2->depth &&
46
- Desc1->arraylevels == Desc2->arraylevels &&
47
- Desc1->miplevels == Desc2->miplevels ;
48
- }
49
-
50
32
// / Construct UR image format from ZE image desc.
51
33
ur_result_t ze2urImageFormat (const ze_image_desc_t *ZeImageDesc,
52
34
ur_image_format_t *UrImageFormat) {
@@ -431,6 +413,90 @@ uint32_t getPixelSizeBytes(const ur_image_format_t *Format) {
431
413
return NumChannels * ChannelTypeSizeInBytes;
432
414
}
433
415
416
+ ur_result_t bindlessImagesCreateImpl (
417
+ ur_context_handle_t hContext, ur_device_handle_t hDevice,
418
+ ur_exp_image_mem_handle_t hImageMem, const ur_image_format_t *pImageFormat,
419
+ const ur_image_desc_t *pImageDesc, ur_sampler_handle_t hSampler,
420
+ ur_mem_handle_t *phMem, ur_exp_image_handle_t *phImage) {
421
+ std::shared_lock<ur_shared_mutex> Lock (hContext->Mutex );
422
+
423
+ UR_ASSERT (hContext && hDevice && hImageMem,
424
+ UR_RESULT_ERROR_INVALID_NULL_HANDLE);
425
+ UR_ASSERT (pImageFormat && pImageDesc && phMem && phImage,
426
+ UR_RESULT_ERROR_INVALID_NULL_POINTER);
427
+
428
+ ZeStruct<ze_image_desc_t > ZeImageDesc;
429
+ UR_CALL (ur2zeImageDesc (pImageFormat, pImageDesc, ZeImageDesc));
430
+
431
+ ZeStruct<ze_image_bindless_exp_desc_t > BindlessDesc;
432
+ BindlessDesc.flags = ZE_IMAGE_BINDLESS_EXP_FLAG_BINDLESS;
433
+ ZeImageDesc.pNext = &BindlessDesc;
434
+
435
+ ZeStruct<ze_sampler_desc_t > ZeSamplerDesc;
436
+ if (hSampler) {
437
+ ZeSamplerDesc = hSampler->ZeSamplerDesc ;
438
+ BindlessDesc.pNext = &ZeSamplerDesc;
439
+ constexpr int ZE_IMAGE_BINDLESS_EXP_FLAG_SAMPLED_IMAGE = 2 ;
440
+ BindlessDesc.flags |= ZE_IMAGE_BINDLESS_EXP_FLAG_SAMPLED_IMAGE;
441
+ }
442
+
443
+ ze_image_handle_t ZeImage;
444
+
445
+ ze_memory_allocation_properties_t MemAllocProperties{
446
+ ZE_STRUCTURE_TYPE_MEMORY_ALLOCATION_PROPERTIES};
447
+ ZE2UR_CALL (zeMemGetAllocProperties,
448
+ (hContext->ZeContext , hImageMem, &MemAllocProperties, nullptr ));
449
+ if (MemAllocProperties.type == ZE_MEMORY_TYPE_UNKNOWN) {
450
+ _ur_image *UrImage = reinterpret_cast <_ur_image *>(hImageMem);
451
+
452
+ ZE2UR_CALL (zeImageViewCreateExt,
453
+ (hContext->ZeContext , hDevice->ZeDevice , &ZeImageDesc,
454
+ UrImage->ZeImage , &ZeImage));
455
+ ZE2UR_CALL (zeContextMakeImageResident,
456
+ (hContext->ZeContext , hDevice->ZeDevice , ZeImage));
457
+ UR_CALL (createUrMemFromZeImage (hContext, ZeImage, /* OwnZeMemHandle*/ true ,
458
+ ZeImageDesc, phMem));
459
+ } else if (MemAllocProperties.type == ZE_MEMORY_TYPE_DEVICE ||
460
+ MemAllocProperties.type == ZE_MEMORY_TYPE_SHARED) {
461
+ ZeStruct<ze_image_pitched_exp_desc_t > PitchedDesc;
462
+ PitchedDesc.ptr = hImageMem;
463
+ if (hSampler) {
464
+ ZeSamplerDesc.pNext = &PitchedDesc;
465
+ } else {
466
+ BindlessDesc.pNext = &PitchedDesc;
467
+ }
468
+
469
+ ZE2UR_CALL (zeImageCreate, (hContext->ZeContext , hDevice->ZeDevice ,
470
+ &ZeImageDesc, &ZeImage));
471
+ ZE2UR_CALL (zeContextMakeImageResident,
472
+ (hContext->ZeContext , hDevice->ZeDevice , ZeImage));
473
+ UR_CALL (createUrMemFromZeImage (hContext, ZeImage, /* OwnZeMemHandle*/ true ,
474
+ ZeImageDesc, phMem));
475
+ } else {
476
+ return UR_RESULT_ERROR_INVALID_VALUE;
477
+ }
478
+
479
+ static std::once_flag InitFlag;
480
+ std::call_once (InitFlag, [&]() {
481
+ ze_driver_handle_t DriverHandle = hContext->getPlatform ()->ZeDriver ;
482
+ auto Result = zeDriverGetExtensionFunctionAddress (
483
+ DriverHandle, " zeImageGetDeviceOffsetExp" ,
484
+ (void **)&zeImageGetDeviceOffsetExpFunctionPtr);
485
+ if (Result != ZE_RESULT_SUCCESS)
486
+ logger::error (" zeDriverGetExtensionFunctionAddress "
487
+ " zeImageGetDeviceOffsetExpv failed, err = {}" ,
488
+ Result);
489
+ });
490
+ if (!zeImageGetDeviceOffsetExpFunctionPtr)
491
+ return UR_RESULT_ERROR_INVALID_OPERATION;
492
+
493
+ uint64_t DeviceOffset{};
494
+ ZE2UR_CALL (zeImageGetDeviceOffsetExpFunctionPtr, (ZeImage, &DeviceOffset));
495
+ *phImage = reinterpret_cast <ur_exp_image_handle_t >(DeviceOffset);
496
+
497
+ return UR_RESULT_SUCCESS;
498
+ }
499
+
434
500
} // namespace
435
501
436
502
ur_result_t getImageRegionHelper (ze_image_desc_t ZeImageDesc,
@@ -664,83 +730,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesUnsampledImageCreateExp(
664
730
ur_exp_image_mem_handle_t hImageMem, const ur_image_format_t *pImageFormat,
665
731
const ur_image_desc_t *pImageDesc, ur_mem_handle_t *phMem,
666
732
ur_exp_image_handle_t *phImage) {
667
- std::shared_lock<ur_shared_mutex> Lock (hContext->Mutex );
668
-
669
- UR_ASSERT (hContext && hDevice && hImageMem,
670
- UR_RESULT_ERROR_INVALID_NULL_HANDLE);
671
- UR_ASSERT (pImageFormat && pImageDesc && phMem && phImage,
672
- UR_RESULT_ERROR_INVALID_NULL_POINTER);
673
-
674
- ZeStruct<ze_image_desc_t > ZeImageDesc;
675
- UR_CALL (ur2zeImageDesc (pImageFormat, pImageDesc, ZeImageDesc));
676
-
677
- ze_image_handle_t ZeImage;
678
-
679
- ze_memory_allocation_properties_t MemAllocProperties{
680
- ZE_STRUCTURE_TYPE_MEMORY_ALLOCATION_PROPERTIES};
681
- ZE2UR_CALL (zeMemGetAllocProperties,
682
- (hContext->ZeContext , hImageMem, &MemAllocProperties, nullptr ));
683
- if (MemAllocProperties.type == ZE_MEMORY_TYPE_UNKNOWN) {
684
- _ur_image *UrImage = reinterpret_cast <_ur_image *>(hImageMem);
685
- if (!isSameImageDesc (&UrImage->ZeImageDesc , &ZeImageDesc)) {
686
- ze_image_bindless_exp_desc_t ZeImageBindlessDesc;
687
- ZeImageBindlessDesc.stype = ZE_STRUCTURE_TYPE_BINDLESS_IMAGE_EXP_DESC;
688
- ZeImageBindlessDesc.pNext = nullptr ;
689
- ZeImageBindlessDesc.flags = ZE_IMAGE_BINDLESS_EXP_FLAG_BINDLESS;
690
- ZeImageDesc.pNext = &ZeImageBindlessDesc;
691
- ZE2UR_CALL (zeImageViewCreateExt,
692
- (hContext->ZeContext , hDevice->ZeDevice , &ZeImageDesc,
693
- UrImage->ZeImage , &ZeImage));
694
- ZE2UR_CALL (zeContextMakeImageResident,
695
- (hContext->ZeContext , hDevice->ZeDevice , ZeImage));
696
- UR_CALL (createUrMemFromZeImage (hContext, ZeImage, /* OwnZeMemHandle*/ true ,
697
- ZeImageDesc, phMem));
698
- } else {
699
- ZeImage = UrImage->ZeImage ;
700
- *phMem = nullptr ;
701
- }
702
- } else if (MemAllocProperties.type == ZE_MEMORY_TYPE_DEVICE ||
703
- MemAllocProperties.type == ZE_MEMORY_TYPE_SHARED) {
704
- ze_image_pitched_exp_desc_t PitchedDesc;
705
- PitchedDesc.stype = ZE_STRUCTURE_TYPE_PITCHED_IMAGE_EXP_DESC;
706
- PitchedDesc.pNext = nullptr ;
707
- PitchedDesc.ptr = hImageMem;
708
-
709
- ze_image_bindless_exp_desc_t BindlessDesc;
710
- BindlessDesc.stype = ZE_STRUCTURE_TYPE_BINDLESS_IMAGE_EXP_DESC;
711
- BindlessDesc.pNext = &PitchedDesc;
712
- BindlessDesc.flags = ZE_IMAGE_BINDLESS_EXP_FLAG_BINDLESS;
713
-
714
- ZeImageDesc.pNext = &BindlessDesc;
715
-
716
- ZE2UR_CALL (zeImageCreate, (hContext->ZeContext , hDevice->ZeDevice ,
717
- &ZeImageDesc, &ZeImage));
718
- ZE2UR_CALL (zeContextMakeImageResident,
719
- (hContext->ZeContext , hDevice->ZeDevice , ZeImage));
720
- UR_CALL (createUrMemFromZeImage (hContext, ZeImage, /* OwnZeMemHandle*/ true ,
721
- ZeImageDesc, phMem));
722
- } else {
723
- return UR_RESULT_ERROR_INVALID_VALUE;
724
- }
725
-
726
- static std::once_flag InitFlag;
727
- std::call_once (InitFlag, [&]() {
728
- ze_driver_handle_t DriverHandle = hContext->getPlatform ()->ZeDriver ;
729
- auto Result = zeDriverGetExtensionFunctionAddress (
730
- DriverHandle, " zeImageGetDeviceOffsetExp" ,
731
- (void **)&zeImageGetDeviceOffsetExpFunctionPtr);
732
- if (Result != ZE_RESULT_SUCCESS)
733
- logger::error (" zeDriverGetExtensionFunctionAddress "
734
- " zeImageGetDeviceOffsetExpv failed, err = {}" ,
735
- Result);
736
- });
737
- if (!zeImageGetDeviceOffsetExpFunctionPtr)
738
- return UR_RESULT_ERROR_INVALID_OPERATION;
739
-
740
- uint64_t DeviceOffset{};
741
- ZE2UR_CALL (zeImageGetDeviceOffsetExpFunctionPtr, (ZeImage, &DeviceOffset));
742
- *phImage = reinterpret_cast <ur_exp_image_handle_t >(DeviceOffset);
743
-
733
+ UR_CALL (bindlessImagesCreateImpl (hContext, hDevice, hImageMem, pImageFormat,
734
+ pImageDesc, nullptr , phMem, phImage));
744
735
return UR_RESULT_SUCCESS;
745
736
}
746
737
@@ -749,19 +740,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesSampledImageCreateExp(
749
740
ur_exp_image_mem_handle_t hImageMem, const ur_image_format_t *pImageFormat,
750
741
const ur_image_desc_t *pImageDesc, ur_sampler_handle_t hSampler,
751
742
ur_mem_handle_t *phMem, ur_exp_image_handle_t *phImage) {
752
-
753
- UR_CALL (urBindlessImagesUnsampledImageCreateExp (
754
- hContext, hDevice, hImageMem, pImageFormat, pImageDesc, phMem, phImage));
755
-
756
- struct combined_sampled_image_handle {
757
- uint64_t RawImageHandle;
758
- uint64_t RawSamplerHandle;
759
- };
760
- auto *SampledImageHandle =
761
- reinterpret_cast <combined_sampled_image_handle *>(phImage);
762
- SampledImageHandle->RawSamplerHandle =
763
- reinterpret_cast <uint64_t >(hSampler->ZeSampler );
764
-
743
+ UR_CALL (bindlessImagesCreateImpl (hContext, hDevice, hImageMem, pImageFormat,
744
+ pImageDesc, hSampler, phMem, phImage));
765
745
return UR_RESULT_SUCCESS;
766
746
}
767
747
0 commit comments