@@ -794,59 +794,125 @@ ur_result_t urBindlessImagesImportExternalSemaphoreExp(
794
794
" {} function not supported!" , __FUNCTION__);
795
795
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
796
796
}
797
- ze_intel_external_semaphore_exp_desc_t SemDesc = {
798
- ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_EXP_DESC, nullptr ,
799
- ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_OPAQUE_FD};
800
- ze_intel_external_semaphore_exp_handle_t ExtSemaphoreHandle;
801
- ze_intel_external_semaphore_desc_fd_exp_desc_t FDExpDesc = {
802
- ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_FD_EXP_DESC, nullptr , 0 };
803
- _ze_intel_external_semaphore_win32_exp_desc_t Win32ExpDesc = {
804
- ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_WIN32_EXP_DESC, nullptr ,
805
- nullptr , nullptr };
806
- void *pNext = const_cast <void *>(pExternalSemaphoreDesc->pNext );
807
- while (pNext != nullptr ) {
808
- const ur_base_desc_t *BaseDesc = static_cast <const ur_base_desc_t *>(pNext);
809
- if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_FILE_DESCRIPTOR) {
810
- auto FileDescriptor =
811
- static_cast <const ur_exp_file_descriptor_t *>(pNext);
812
- FDExpDesc.fd = FileDescriptor->fd ;
813
- SemDesc.pNext = &FDExpDesc;
814
- switch (semHandleType) {
815
- case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_OPAQUE_FD:
816
- SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_OPAQUE_FD;
817
- break ;
818
- case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_TIMELINE_FD:
819
- SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_TIMELINE_SEMAPHORE_FD;
820
- break ;
821
- default :
822
- return UR_RESULT_ERROR_INVALID_VALUE;
797
+ if (UrPlatform->ZeExternalSemaphoreExt .LoaderExtension ) {
798
+ ze_external_semaphore_ext_desc_t SemDesc = {
799
+ ZE_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_EXT_DESC, nullptr ,
800
+ ZE_EXTERNAL_SEMAPHORE_EXT_FLAG_OPAQUE_FD};
801
+ ze_external_semaphore_ext_handle_t ExtSemaphoreHandle;
802
+ ze_external_semaphore_fd_ext_desc_t FDExpDesc = {
803
+ ZE_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_FD_EXT_DESC, nullptr , 0 };
804
+ ze_external_semaphore_win32_ext_desc_t Win32ExpDesc = {
805
+ ZE_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_WIN32_EXT_DESC, nullptr , nullptr ,
806
+ nullptr };
807
+ void *pNext = const_cast <void *>(pExternalSemaphoreDesc->pNext );
808
+ while (pNext != nullptr ) {
809
+ const ur_base_desc_t *BaseDesc =
810
+ static_cast <const ur_base_desc_t *>(pNext);
811
+ if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_FILE_DESCRIPTOR) {
812
+ auto FileDescriptor =
813
+ static_cast <const ur_exp_file_descriptor_t *>(pNext);
814
+ FDExpDesc.fd = FileDescriptor->fd ;
815
+ SemDesc.pNext = &FDExpDesc;
816
+ switch (semHandleType) {
817
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_OPAQUE_FD:
818
+ SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXT_FLAG_OPAQUE_FD;
819
+ break ;
820
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_TIMELINE_FD:
821
+ SemDesc.flags =
822
+ ZE_EXTERNAL_SEMAPHORE_EXT_FLAG_VK_TIMELINE_SEMAPHORE_FD;
823
+ break ;
824
+ default :
825
+ return UR_RESULT_ERROR_INVALID_VALUE;
826
+ }
827
+ } else if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_WIN32_HANDLE) {
828
+ SemDesc.pNext = &Win32ExpDesc;
829
+ auto Win32Handle = static_cast <const ur_exp_win32_handle_t *>(pNext);
830
+ switch (semHandleType) {
831
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_WIN32_NT:
832
+ SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXT_FLAG_OPAQUE_WIN32;
833
+ break ;
834
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_WIN32_NT_DX12_FENCE:
835
+ SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXT_FLAG_D3D12_FENCE;
836
+ break ;
837
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_TIMELINE_WIN32_NT:
838
+ SemDesc.flags =
839
+ ZE_EXTERNAL_SEMAPHORE_EXT_FLAG_VK_TIMELINE_SEMAPHORE_WIN32;
840
+ break ;
841
+ default :
842
+ return UR_RESULT_ERROR_INVALID_VALUE;
843
+ }
844
+ Win32ExpDesc.handle = Win32Handle->handle ;
823
845
}
824
- } else if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_WIN32_HANDLE) {
825
- SemDesc.pNext = &Win32ExpDesc;
826
- auto Win32Handle = static_cast <const ur_exp_win32_handle_t *>(pNext);
827
- switch (semHandleType) {
828
- case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_WIN32_NT:
829
- SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_OPAQUE_WIN32;
830
- break ;
831
- case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_WIN32_NT_DX12_FENCE:
832
- SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_D3D12_FENCE;
833
- break ;
834
- case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_TIMELINE_WIN32_NT:
835
- SemDesc.flags =
836
- ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_TIMELINE_SEMAPHORE_WIN32;
837
- break ;
838
- default :
839
- return UR_RESULT_ERROR_INVALID_VALUE;
846
+ pNext = const_cast <void *>(BaseDesc->pNext );
847
+ }
848
+ ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt .zexImportExternalSemaphoreExp ,
849
+ (hDevice->ZeDevice , &SemDesc, &ExtSemaphoreHandle));
850
+ *phExternalSemaphoreHandle =
851
+ (ur_exp_external_semaphore_handle_t )ExtSemaphoreHandle;
852
+
853
+ } else {
854
+ ze_intel_external_semaphore_exp_desc_t SemDesc = {
855
+ ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_EXP_DESC, nullptr ,
856
+ ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_OPAQUE_FD};
857
+ ze_intel_external_semaphore_exp_handle_t ExtSemaphoreHandle;
858
+ ze_intel_external_semaphore_desc_fd_exp_desc_t FDExpDesc = {
859
+ ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_FD_EXP_DESC, nullptr , 0 };
860
+ _ze_intel_external_semaphore_win32_exp_desc_t Win32ExpDesc = {
861
+ ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_WIN32_EXP_DESC, nullptr ,
862
+ nullptr , nullptr };
863
+ void *pNext = const_cast <void *>(pExternalSemaphoreDesc->pNext );
864
+ while (pNext != nullptr ) {
865
+ const ur_base_desc_t *BaseDesc =
866
+ static_cast <const ur_base_desc_t *>(pNext);
867
+ if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_FILE_DESCRIPTOR) {
868
+ auto FileDescriptor =
869
+ static_cast <const ur_exp_file_descriptor_t *>(pNext);
870
+ FDExpDesc.fd = FileDescriptor->fd ;
871
+ SemDesc.pNext = &FDExpDesc;
872
+ switch (semHandleType) {
873
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_OPAQUE_FD:
874
+ SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_OPAQUE_FD;
875
+ break ;
876
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_TIMELINE_FD:
877
+ SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_TIMELINE_SEMAPHORE_FD;
878
+ break ;
879
+ default :
880
+ return UR_RESULT_ERROR_INVALID_VALUE;
881
+ }
882
+ } else if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_WIN32_HANDLE) {
883
+ SemDesc.pNext = &Win32ExpDesc;
884
+ auto Win32Handle = static_cast <const ur_exp_win32_handle_t *>(pNext);
885
+ switch (semHandleType) {
886
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_WIN32_NT:
887
+ SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_OPAQUE_WIN32;
888
+ break ;
889
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_WIN32_NT_DX12_FENCE:
890
+ SemDesc.flags = ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_D3D12_FENCE;
891
+ break ;
892
+ case UR_EXP_EXTERNAL_SEMAPHORE_TYPE_TIMELINE_WIN32_NT:
893
+ SemDesc.flags =
894
+ ZE_EXTERNAL_SEMAPHORE_EXP_FLAGS_TIMELINE_SEMAPHORE_WIN32;
895
+ break ;
896
+ default :
897
+ return UR_RESULT_ERROR_INVALID_VALUE;
898
+ }
899
+ Win32ExpDesc.handle = Win32Handle->handle ;
840
900
}
841
- Win32ExpDesc. handle = Win32Handle-> handle ;
901
+ pNext = const_cast < void *>(BaseDesc-> pNext ) ;
842
902
}
843
- pNext = const_cast <void *>(BaseDesc->pNext );
844
- }
845
903
846
- ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt .zexImportExternalSemaphoreExp ,
847
- (hDevice->ZeDevice , &SemDesc, &ExtSemaphoreHandle));
848
- *phExternalSemaphoreHandle =
849
- (ur_exp_external_semaphore_handle_t )ExtSemaphoreHandle;
904
+ ze_device_handle_t translatedDevice;
905
+ ZE2UR_CALL (zelLoaderTranslateHandle, (ZEL_HANDLE_DEVICE, hDevice->ZeDevice ,
906
+ (void **)&translatedDevice));
907
+ // If the L0 loader is not aware of the extension, the handles need to be
908
+ // translated
909
+ ZE2UR_CALL (
910
+ UrPlatform->ZeExternalSemaphoreExt .zexExpImportExternalSemaphoreExp ,
911
+ (translatedDevice, &SemDesc, &ExtSemaphoreHandle));
912
+
913
+ *phExternalSemaphoreHandle =
914
+ (ur_exp_external_semaphore_handle_t )ExtSemaphoreHandle;
915
+ }
850
916
851
917
return UR_RESULT_SUCCESS;
852
918
}
@@ -861,9 +927,15 @@ ur_result_t urBindlessImagesReleaseExternalSemaphoreExp(
861
927
" {} function not supported!" , __FUNCTION__);
862
928
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
863
929
}
864
- ZE2UR_CALL (
865
- UrPlatform->ZeExternalSemaphoreExt .zexDeviceReleaseExternalSemaphoreExp ,
866
- ((ze_intel_external_semaphore_exp_handle_t )hExternalSemaphore));
930
+ if (UrPlatform->ZeExternalSemaphoreExt .LoaderExtension ) {
931
+ ZE2UR_CALL (
932
+ UrPlatform->ZeExternalSemaphoreExt .zexDeviceReleaseExternalSemaphoreExp ,
933
+ ((ze_external_semaphore_ext_handle_t )hExternalSemaphore));
934
+ } else {
935
+ ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt
936
+ .zexExpDeviceReleaseExternalSemaphoreExp ,
937
+ ((ze_intel_external_semaphore_exp_handle_t )hExternalSemaphore));
938
+ }
867
939
868
940
return UR_RESULT_SUCCESS;
869
941
}
@@ -910,15 +982,44 @@ ur_result_t urBindlessImagesWaitExternalSemaphoreExp(
910
982
const auto &ZeCommandList = CommandList->first ;
911
983
const auto &WaitList = (*Event)->WaitList ;
912
984
913
- ze_intel_external_semaphore_wait_params_exp_t WaitParams = {
914
- ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_WAIT_PARAMS_EXP, nullptr , 0 };
915
- WaitParams.value = hasValue ? waitValue : 0 ;
916
- const ze_intel_external_semaphore_exp_handle_t hExtSemaphore =
917
- reinterpret_cast <ze_intel_external_semaphore_exp_handle_t >(hSemaphore);
918
- ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt
919
- .zexCommandListAppendWaitExternalSemaphoresExp ,
920
- (ZeCommandList, 1 , &hExtSemaphore, &WaitParams, ZeEvent,
921
- WaitList.Length , WaitList.ZeEventList ));
985
+ if (UrPlatform->ZeExternalSemaphoreExt .LoaderExtension ) {
986
+ ze_external_semaphore_wait_params_ext_t WaitParams = {
987
+ ZE_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_WAIT_PARAMS_EXT, nullptr , 0 };
988
+ WaitParams.value = hasValue ? waitValue : 0 ;
989
+ ze_external_semaphore_ext_handle_t hExtSemaphore =
990
+ reinterpret_cast <ze_external_semaphore_ext_handle_t >(hSemaphore);
991
+ ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt
992
+ .zexCommandListAppendWaitExternalSemaphoresExp ,
993
+ (ZeCommandList, 1 , &hExtSemaphore, &WaitParams, ZeEvent,
994
+ WaitList.Length , WaitList.ZeEventList ));
995
+ } else {
996
+ ze_command_list_handle_t translatedCommandList;
997
+ ZE2UR_CALL (zelLoaderTranslateHandle,
998
+ (ZEL_HANDLE_COMMAND_LIST, ZeCommandList,
999
+ (void **)&translatedCommandList));
1000
+ ze_event_handle_t translatedEvent = ZeEvent;
1001
+ if (ZeEvent) {
1002
+ ZE2UR_CALL (zelLoaderTranslateHandle,
1003
+ (ZEL_HANDLE_EVENT, ZeEvent, (void **)&translatedEvent));
1004
+ }
1005
+ std::vector<ze_event_handle_t > EventHandles (WaitList.Length + 1 , nullptr );
1006
+ if (WaitList.Length > 0 ) {
1007
+ for (size_t i = 0 ; i < WaitList.Length ; i++) {
1008
+ ze_event_handle_t ZeEvent = WaitList.ZeEventList [i];
1009
+ ZE2UR_CALL (zelLoaderTranslateHandle,
1010
+ (ZEL_HANDLE_EVENT, ZeEvent, (void **)&EventHandles[i + 1 ]));
1011
+ }
1012
+ }
1013
+ ze_intel_external_semaphore_wait_params_exp_t WaitParams = {
1014
+ ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_WAIT_PARAMS_EXP, nullptr , 0 };
1015
+ WaitParams.value = hasValue ? waitValue : 0 ;
1016
+ const ze_intel_external_semaphore_exp_handle_t hExtSemaphore =
1017
+ reinterpret_cast <ze_intel_external_semaphore_exp_handle_t >(hSemaphore);
1018
+ ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt
1019
+ .zexExpCommandListAppendWaitExternalSemaphoresExp ,
1020
+ (translatedCommandList, 1 , &hExtSemaphore, &WaitParams,
1021
+ translatedEvent, WaitList.Length , EventHandles.data ()));
1022
+ }
922
1023
923
1024
return UR_RESULT_SUCCESS;
924
1025
}
@@ -927,13 +1028,6 @@ ur_result_t urBindlessImagesSignalExternalSemaphoreExp(
927
1028
ur_queue_handle_t hQueue, ur_exp_external_semaphore_handle_t hSemaphore,
928
1029
bool hasValue, uint64_t signalValue, uint32_t numEventsInWaitList,
929
1030
const ur_event_handle_t *phEventWaitList, ur_event_handle_t *phEvent) {
930
- std::ignore = hQueue;
931
- std::ignore = hSemaphore;
932
- std::ignore = hasValue;
933
- std::ignore = signalValue;
934
- std::ignore = numEventsInWaitList;
935
- std::ignore = phEventWaitList;
936
- std::ignore = phEvent;
937
1031
auto UrPlatform = hQueue->Context ->getPlatform ();
938
1032
if (UrPlatform->ZeExternalSemaphoreExt .Supported == false ) {
939
1033
logger::error (logger::LegacyMessage (" [UR][L0] " ),
@@ -972,16 +1066,47 @@ ur_result_t urBindlessImagesSignalExternalSemaphoreExp(
972
1066
const auto &ZeCommandList = CommandList->first ;
973
1067
const auto &WaitList = (*Event)->WaitList ;
974
1068
975
- ze_intel_external_semaphore_signal_params_exp_t SignalParams = {
976
- ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_EXP, nullptr , 0 };
977
- SignalParams.value = hasValue ? signalValue : 0 ;
978
- const ze_intel_external_semaphore_exp_handle_t hExtSemaphore =
979
- reinterpret_cast <ze_intel_external_semaphore_exp_handle_t >(hSemaphore);
980
-
981
- ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt
982
- .zexCommandListAppendSignalExternalSemaphoresExp ,
983
- (ZeCommandList, 1 , &hExtSemaphore, &SignalParams, ZeEvent,
984
- WaitList.Length , WaitList.ZeEventList ));
1069
+ if (UrPlatform->ZeExternalSemaphoreExt .LoaderExtension ) {
1070
+ ze_external_semaphore_signal_params_ext_t SignalParams = {
1071
+ ZE_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_EXT, nullptr , 0 };
1072
+ SignalParams.value = hasValue ? signalValue : 0 ;
1073
+ ze_external_semaphore_ext_handle_t hExtSemaphore =
1074
+ reinterpret_cast <ze_external_semaphore_ext_handle_t >(hSemaphore);
1075
+
1076
+ ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt
1077
+ .zexCommandListAppendSignalExternalSemaphoresExp ,
1078
+ (ZeCommandList, 1 , &hExtSemaphore, &SignalParams, ZeEvent,
1079
+ WaitList.Length , WaitList.ZeEventList ));
1080
+ } else {
1081
+ ze_intel_external_semaphore_signal_params_exp_t SignalParams = {
1082
+ ZE_INTEL_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_EXP, nullptr ,
1083
+ 0 };
1084
+ SignalParams.value = hasValue ? signalValue : 0 ;
1085
+ const ze_intel_external_semaphore_exp_handle_t hExtSemaphore =
1086
+ reinterpret_cast <ze_intel_external_semaphore_exp_handle_t >(hSemaphore);
1087
+
1088
+ ze_command_list_handle_t translatedCommandList;
1089
+ ZE2UR_CALL (zelLoaderTranslateHandle,
1090
+ (ZEL_HANDLE_COMMAND_LIST, ZeCommandList,
1091
+ (void **)&translatedCommandList));
1092
+ ze_event_handle_t translatedEvent = ZeEvent;
1093
+ if (ZeEvent) {
1094
+ ZE2UR_CALL (zelLoaderTranslateHandle,
1095
+ (ZEL_HANDLE_EVENT, ZeEvent, (void **)&translatedEvent));
1096
+ }
1097
+ std::vector<ze_event_handle_t > EventHandles (WaitList.Length + 1 , nullptr );
1098
+ if (WaitList.Length > 0 ) {
1099
+ for (size_t i = 0 ; i < WaitList.Length ; i++) {
1100
+ ze_event_handle_t ZeEvent = WaitList.ZeEventList [i];
1101
+ ZE2UR_CALL (zelLoaderTranslateHandle,
1102
+ (ZEL_HANDLE_EVENT, ZeEvent, (void **)&EventHandles[i + 1 ]));
1103
+ }
1104
+ }
1105
+ ZE2UR_CALL (UrPlatform->ZeExternalSemaphoreExt
1106
+ .zexExpCommandListAppendSignalExternalSemaphoresExp ,
1107
+ (translatedCommandList, 1 , &hExtSemaphore, &SignalParams,
1108
+ translatedEvent, WaitList.Length , EventHandles.data ()));
1109
+ }
985
1110
986
1111
return UR_RESULT_SUCCESS;
987
1112
}
0 commit comments