@@ -230,80 +230,98 @@ struct SLayerContext
230230
231231 // USM Types:
232232
233+ cl_svm_capabilities_khr combinedCaps = 0 ;
233234 for (auto device: devices) {
234235 cl_svm_capabilities_khr caps = getDeviceUSMCaps (device);
235236 if (caps != 0 ) {
236- typeCapsPlatform.push_back (CL_SVM_TYPE_MACRO_DEVICE_KHR);
237- break ;
237+ combinedCaps = (combinedCaps == 0 ) ? caps : (combinedCaps & caps);
238238 }
239239 }
240+ if (combinedCaps != 0 ) {
241+ typeCapsPlatform.push_back (combinedCaps);
242+ }
243+
244+ combinedCaps = 0 ;
240245 for (auto device: devices) {
241246 cl_svm_capabilities_khr caps = getHostUSMCaps (device);
242247 if (caps != 0 ) {
243- typeCapsPlatform.push_back (CL_SVM_TYPE_MACRO_HOST_KHR);
244- break ;
248+ combinedCaps = (combinedCaps == 0 ) ? caps : (combinedCaps & caps);
245249 }
246250 }
251+ if (combinedCaps != 0 ) {
252+ typeCapsPlatform.push_back (combinedCaps);
253+ }
254+
255+ combinedCaps = 0 ;
247256 for (auto device: devices) {
248257 cl_svm_capabilities_khr caps = getSingleDeviceSharedUSMCaps (device);
249258 if (caps != 0 ) {
250- typeCapsPlatform.push_back (CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR);
251- break ;
259+ combinedCaps = (combinedCaps == 0 ) ? caps : (combinedCaps & caps);
252260 }
253261 }
262+ if (combinedCaps != 0 ) {
263+ typeCapsPlatform.push_back (combinedCaps);
264+ }
254265
255266 // SVM Types:
256267
268+ combinedCaps = 0 ;
257269 for (auto device: devices) {
258270 cl_svm_capabilities_khr caps = getCoarseGrainSVMCaps (device);
259271 if (caps != 0 ) {
260- typeCapsPlatform.push_back (CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR);
261- break ;
272+ combinedCaps = (combinedCaps == 0 ) ? caps : (combinedCaps & caps);
262273 }
263274 }
275+ if (combinedCaps != 0 ) {
276+ typeCapsPlatform.push_back (combinedCaps);
277+ }
278+
264279 for (auto device: devices) {
265280 cl_svm_capabilities_khr caps = getFineGrainSVMCaps (device);
266281 if (caps != 0 ) {
267- typeCapsPlatform.push_back (CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR);
268- break ;
282+ combinedCaps = (combinedCaps == 0 ) ? caps : (combinedCaps & caps);
269283 }
270284 }
285+ if (combinedCaps != 0 ) {
286+ typeCapsPlatform.push_back (combinedCaps);
287+ }
288+
271289 for (auto device: devices) {
272290 cl_svm_capabilities_khr caps = getSystemSVMCaps (device);
273291 if (caps != 0 ) {
274- typeCapsPlatform.push_back (CL_SVM_TYPE_MACRO_SYSTEM_KHR);
275- break ;
292+ combinedCaps = (combinedCaps == 0 ) ? caps : (combinedCaps & caps);
276293 }
277294 }
295+ if (combinedCaps != 0 ) {
296+ typeCapsPlatform.push_back (combinedCaps);
297+ }
278298
279299 TypeCapsPlatform[platform] = typeCapsPlatform;
280300
281301 for (auto device: devices) {
282302 std::vector<cl_svm_capabilities_khr> typeCapsDevice;
283303
284304 for (auto caps: typeCapsPlatform) {
285- switch (caps) {
286- case CL_SVM_TYPE_MACRO_DEVICE_KHR:
305+ if ((caps & CL_SVM_TYPE_MACRO_DEVICE_KHR) == CL_SVM_TYPE_MACRO_DEVICE_KHR) {
287306 typeCapsDevice.push_back (getDeviceUSMCaps (device));
288- break ;
289- case CL_SVM_TYPE_MACRO_HOST_KHR:
307+ }
308+ else if ((caps & CL_SVM_TYPE_MACRO_HOST_KHR) == CL_SVM_TYPE_MACRO_HOST_KHR) {
290309 typeCapsDevice.push_back (getHostUSMCaps (device));
291- break ;
292- case CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR:
310+ }
311+ else if ((caps & CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR) == CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR) {
293312 typeCapsDevice.push_back (getSingleDeviceSharedUSMCaps (device));
294- break ;
295- case CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR:
313+ }
314+ else if ((caps & CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR) == CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR) {
296315 typeCapsDevice.push_back (getCoarseGrainSVMCaps (device));
297- break ;
298- case CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR:
316+ }
317+ else if ((caps & CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR) == CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR) {
299318 typeCapsDevice.push_back (getFineGrainSVMCaps (device));
300- break ;
301- case CL_SVM_TYPE_MACRO_SYSTEM_KHR:
319+ }
320+ else if ((caps & CL_SVM_TYPE_MACRO_SYSTEM_KHR) == CL_SVM_TYPE_MACRO_SYSTEM_KHR) {
302321 typeCapsDevice.push_back (getSystemSVMCaps (device));
303- break ;
304- default :
322+ }
323+ else {
305324 assert (0 && " unknown platform SVM type" );
306- break ;
307325 }
308326 }
309327
0 commit comments