@@ -316,20 +316,58 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramSetSpecializationConstants(
316
316
CL_RETURN_ON_FAILURE (clGetProgramInfo (CLProg, CL_PROGRAM_CONTEXT, sizeof (Ctx),
317
317
&Ctx, &RetSize));
318
318
319
- cl_ext::clSetProgramSpecializationConstant_fn F = nullptr ;
320
- const ur_result_t URResult = cl_ext::getExtFuncFromContext<decltype (F)>(
321
- Ctx, cl_ext::ExtFuncPtrCache->clSetProgramSpecializationConstantCache ,
322
- cl_ext::SetProgramSpecializationConstantName, &F);
319
+ std::unique_ptr<std::vector<cl_device_id>> DevicesInCtx;
320
+ cl_adapter::getDevicesFromContext (cl_adapter::cast<ur_context_handle_t >(Ctx),
321
+ DevicesInCtx);
323
322
324
- if (URResult != UR_RESULT_SUCCESS) {
325
- return URResult;
326
- }
323
+ cl_platform_id CurPlatform;
324
+ clGetDeviceInfo ((*DevicesInCtx)[0 ], CL_DEVICE_PLATFORM,
325
+ sizeof (cl_platform_id), &CurPlatform, nullptr );
326
+
327
+ oclv::OpenCLVersion PlatVer;
328
+ cl_adapter::getPlatformVersion (CurPlatform, PlatVer);
329
+
330
+ bool UseExtensionLookup = false ;
331
+ if (PlatVer < oclv::V2_2) {
332
+ UseExtensionLookup = true ;
333
+ } else {
334
+ for (cl_device_id Dev : *DevicesInCtx) {
335
+ oclv::OpenCLVersion DevVer;
327
336
328
- for (uint32_t i = 0 ; i < count; ++i) {
329
- CL_RETURN_ON_FAILURE (F (CLProg, pSpecConstants[i].id , pSpecConstants[i].size ,
330
- pSpecConstants[i].pValue ));
337
+ cl_adapter::getDeviceVersion (Dev, DevVer);
338
+
339
+ if (DevVer < oclv::V2_2) {
340
+ UseExtensionLookup = true ;
341
+ break ;
342
+ }
343
+ }
331
344
}
332
345
346
+ if (UseExtensionLookup == false ) {
347
+ for (uint32_t i = 0 ; i < count; ++i) {
348
+ CL_RETURN_ON_FAILURE (clSetProgramSpecializationConstant (
349
+ CLProg, pSpecConstants[i].id , pSpecConstants[i].size ,
350
+ pSpecConstants[i].pValue ));
351
+ }
352
+ } else {
353
+ cl_ext::clSetProgramSpecializationConstant_fn
354
+ SetProgramSpecializationConstant = nullptr ;
355
+ const ur_result_t URResult = cl_ext::getExtFuncFromContext<
356
+ decltype (SetProgramSpecializationConstant)>(
357
+ Ctx, cl_ext::ExtFuncPtrCache->clSetProgramSpecializationConstantCache ,
358
+ cl_ext::SetProgramSpecializationConstantName,
359
+ &SetProgramSpecializationConstant);
360
+
361
+ if (URResult != UR_RESULT_SUCCESS) {
362
+ return URResult;
363
+ }
364
+
365
+ for (uint32_t i = 0 ; i < count; ++i) {
366
+ CL_RETURN_ON_FAILURE (SetProgramSpecializationConstant (
367
+ CLProg, pSpecConstants[i].id , pSpecConstants[i].size ,
368
+ pSpecConstants[i].pValue ));
369
+ }
370
+ }
333
371
return UR_RESULT_SUCCESS;
334
372
}
335
373
0 commit comments