@@ -1636,8 +1636,9 @@ static void ReverseRangeDimensionsForKernel(NDRDescT &NDR) {
16361636}
16371637
16381638pi_result ExecCGCommand::SetKernelParamsAndLaunch (
1639- CGExecKernel *ExecKernel, RT::PiKernel Kernel, NDRDescT &NDRDesc,
1640- std::vector<RT::PiEvent> &RawEvents, RT::PiEvent &Event,
1639+ CGExecKernel *ExecKernel,
1640+ std::shared_ptr<device_image_impl> DeviceImageImpl, RT::PiKernel Kernel,
1641+ NDRDescT &NDRDesc, std::vector<RT::PiEvent> &RawEvents, RT::PiEvent &Event,
16411642 ProgramManager::KernelArgMask EliminatedArgMask) {
16421643 vector_class<ArgDesc> &Args = ExecKernel->MArgs ;
16431644 // TODO this is not necessary as long as we can guarantee that the arguments
@@ -1692,9 +1693,21 @@ pi_result ExecCGCommand::SetKernelParamsAndLaunch(
16921693 break ;
16931694 }
16941695 case kernel_param_kind_t ::kind_specialization_constants_buffer: {
1695- throw cl::sycl::feature_not_supported (
1696- " SYCL2020 specialization constants are not yet fully supported" ,
1697- PI_INVALID_OPERATION);
1696+ if (MQueue->is_host ()) {
1697+ throw cl::sycl::feature_not_supported (
1698+ " SYCL2020 specialization constants are not yet supported on host "
1699+ " device" ,
1700+ PI_INVALID_OPERATION);
1701+ }
1702+ if (DeviceImageImpl != nullptr ) {
1703+ RT::PiMem SpecConstsBuffer =
1704+ DeviceImageImpl->get_spec_const_buffer_ref ();
1705+ Plugin.call <PiApiKind::piKernelSetArg>(
1706+ Kernel, NextTrueIndex, sizeof (RT::PiMem), &SpecConstsBuffer);
1707+ } else {
1708+ Plugin.call <PiApiKind::piKernelSetArg>(Kernel, NextTrueIndex,
1709+ sizeof (RT::PiMem), nullptr );
1710+ }
16981711 break ;
16991712 }
17001713 }
@@ -1916,6 +1929,8 @@ cl_int ExecCGCommand::enqueueImp() {
19161929 bool KnownProgram = true ;
19171930
19181931 std::shared_ptr<kernel_impl> SyclKernelImpl;
1932+ std::shared_ptr<device_image_impl> DeviceImageImpl;
1933+
19191934 // Use kernel_bundle is available
19201935 if (KernelBundleImplPtr) {
19211936
@@ -1929,9 +1944,7 @@ cl_int ExecCGCommand::enqueueImp() {
19291944 SyclKernelImpl = detail::getSyclObjImpl (SyclKernel);
19301945
19311946 Kernel = SyclKernelImpl->getHandleRef ();
1932-
1933- std::shared_ptr<device_image_impl> DeviceImageImpl =
1934- SyclKernelImpl->getDeviceImage ();
1947+ DeviceImageImpl = SyclKernelImpl->getDeviceImage ();
19351948
19361949 Program = DeviceImageImpl->get_program_ref ();
19371950
@@ -1979,11 +1992,13 @@ cl_int ExecCGCommand::enqueueImp() {
19791992 if (KernelMutex != nullptr ) {
19801993 // For cacheable kernels, we use per-kernel mutex
19811994 std::lock_guard<std::mutex> Lock (*KernelMutex);
1982- Error = SetKernelParamsAndLaunch (ExecKernel, Kernel, NDRDesc, RawEvents,
1983- Event, EliminatedArgMask);
1995+ Error =
1996+ SetKernelParamsAndLaunch (ExecKernel, DeviceImageImpl, Kernel, NDRDesc,
1997+ RawEvents, Event, EliminatedArgMask);
19841998 } else {
1985- Error = SetKernelParamsAndLaunch (ExecKernel, Kernel, NDRDesc, RawEvents,
1986- Event, EliminatedArgMask);
1999+ Error =
2000+ SetKernelParamsAndLaunch (ExecKernel, DeviceImageImpl, Kernel, NDRDesc,
2001+ RawEvents, Event, EliminatedArgMask);
19872002 }
19882003
19892004 if (PI_SUCCESS != Error) {
0 commit comments