@@ -387,24 +387,62 @@ namespace detail {
387387// ///////////////////////
388388// syclex::detail::is_source_kernel_bundle_supported
389389// ///////////////////////
390- bool is_source_kernel_bundle_supported (backend BE, source_language Language) {
390+
391+ bool is_source_kernel_bundle_supported (
392+ sycl::ext::oneapi::experimental::source_language Language,
393+ const std::vector<DeviceImplPtr> &DeviceImplVec) {
394+ backend BE = DeviceImplVec[0 ]->getBackend ();
391395 // Support is limited to the opencl and level_zero backends.
392396 bool BE_Acceptable = (BE == sycl::backend::ext_oneapi_level_zero) ||
393397 (BE == sycl::backend::opencl);
394- if (BE_Acceptable) {
395- if (Language == source_language::opencl) {
396- return detail::OpenCLC_Compilation_Available ();
397- } else if (Language == source_language::spirv) {
398- return true ;
399- } else if (Language == source_language::sycl) {
400- return detail::SYCL_JIT_Compilation_Available ();
401- }
398+ if (!BE_Acceptable)
399+ return false ;
400+
401+ if (Language == source_language::spirv) {
402+ return true ;
403+ } else if (Language == source_language::sycl) {
404+ return detail::SYCL_JIT_Compilation_Available ();
405+ } else if (Language == source_language::opencl) {
406+ if (DeviceImplVec.empty ())
407+ return false ;
408+
409+ const AdapterPtr &Adapter = DeviceImplVec[0 ]->getAdapter ();
410+ std::vector<uint32_t > IPVersionVec;
411+ IPVersionVec.reserve (DeviceImplVec.size ());
412+
413+ std::transform (DeviceImplVec.begin (), DeviceImplVec.end (),
414+ std::back_inserter (IPVersionVec),
415+ [&](const DeviceImplPtr &Impl) {
416+ uint32_t ipVersion = 0 ;
417+ ur_device_handle_t DeviceHandle = Impl->getHandleRef ();
418+ Adapter->call <UrApiKind::urDeviceGetInfo>(
419+ DeviceHandle, UR_DEVICE_INFO_IP_VERSION,
420+ sizeof (uint32_t ), &ipVersion, nullptr );
421+ return ipVersion;
422+ });
423+
424+ return detail::OpenCLC_Compilation_Available (IPVersionVec);
402425 }
403426
404427 // otherwise
405428 return false ;
406429}
407430
431+ bool is_source_kernel_bundle_supported (
432+ sycl::ext::oneapi::experimental::source_language Language,
433+ const context &Ctx) {
434+ const std::vector<sycl::device> Devices = Ctx.get_devices ();
435+ std::vector<DeviceImplPtr> DeviceImplVec;
436+ DeviceImplVec.reserve (Devices.size ());
437+ std::transform (Devices.begin (), Devices.end (),
438+ std::back_inserter (DeviceImplVec),
439+ [](const sycl::device &dev) {
440+ return sycl::detail::getSyclObjImpl (dev);
441+ });
442+
443+ return is_source_kernel_bundle_supported (Language, DeviceImplVec);
444+ }
445+
408446// ///////////////////////
409447// syclex::detail::create_kernel_bundle_from_source
410448// ///////////////////////
@@ -428,8 +466,7 @@ make_kernel_bundle_from_source(const context &SyclContext,
428466 for (auto &p : IncludePairViews)
429467 IncludePairs.push_back ({p.first .data (), p.second .data ()});
430468
431- backend BE = SyclContext.get_backend ();
432- if (!is_source_kernel_bundle_supported (BE, Language))
469+ if (!is_source_kernel_bundle_supported (Language, SyclContext))
433470 throw sycl::exception (make_error_code (errc::invalid),
434471 " kernel_bundle creation from source not supported" );
435472
@@ -448,8 +485,7 @@ source_kb make_kernel_bundle_from_source(const context &SyclContext,
448485 const std::vector<std::byte> &Bytes,
449486 include_pairs_view_t IncludePairs) {
450487 (void )IncludePairs;
451- backend BE = SyclContext.get_backend ();
452- if (!is_source_kernel_bundle_supported (BE, Language))
488+ if (!is_source_kernel_bundle_supported (Language, SyclContext))
453489 throw sycl::exception (make_error_code (errc::invalid),
454490 " kernel_bundle creation from source not supported" );
455491
0 commit comments