diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 7b79cb5b27..da7ca27aeb 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -155,7 +155,7 @@ namespace cv static Context* getContext(); static void setContext(Info &oclinfo); - enum {CL_DOUBLE, CL_UNIFIED_MEM, CL_CPU}; + enum {CL_DOUBLE, CL_UNIFIED_MEM}; bool supportsFeature(int ftype); size_t computeUnits(); void* oclContext(); diff --git a/modules/ocl/include/opencv2/ocl/private/util.hpp b/modules/ocl/include/opencv2/ocl/private/util.hpp index 62e69a8a24..081d2343dc 100644 --- a/modules/ocl/include/opencv2/ocl/private/util.hpp +++ b/modules/ocl/include/opencv2/ocl/private/util.hpp @@ -127,8 +127,9 @@ namespace cv // currently only support wavefront size queries enum DEVICE_INFO { - WAVEFRONT_SIZE, //in AMD speak - WARP_SIZE = WAVEFRONT_SIZE //in nvidia speak + WAVEFRONT_SIZE, //in AMD speak + WARP_SIZE = WAVEFRONT_SIZE, //in nvidia speak + IS_CPU_DEVICE //check if the device is CPU }; //info should have been pre-allocated void CV_EXPORTS queryDeviceInfo(DEVICE_INFO info_type, void* info); diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index 78263d86ae..bdcbfa517e 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -397,6 +397,15 @@ namespace cv } break; + case IS_CPU_DEVICE: + { + cl_device_type devicetype; + openCLSafeCall(clGetDeviceInfo(impl->devices[impl->devnum], + CL_DEVICE_TYPE, sizeof(cl_device_type), + &devicetype, NULL)); + *(bool*)info = (devicetype == CVCL_DEVICE_TYPE_CPU); + } + break; default: CV_Error(-1, "Invalid device info type"); break; @@ -979,12 +988,6 @@ namespace cv return impl->double_support == 1; case CL_UNIFIED_MEM: return impl->unified_memory == 1; - case CL_CPU: - cl_device_type devicetype; - clGetDeviceInfo(impl->devices[impl->devnum], - CL_DEVICE_TYPE, sizeof(cl_device_type), - &devicetype, NULL); - return devicetype == CVCL_DEVICE_TYPE_CPU; default: return false; } diff --git a/modules/ocl/src/pyrlk.cpp b/modules/ocl/src/pyrlk.cpp index 374134c1cd..4a6ce1c790 100644 --- a/modules/ocl/src/pyrlk.cpp +++ b/modules/ocl/src/pyrlk.cpp @@ -187,7 +187,9 @@ static void lkSparse_run(oclMat &I, oclMat &J, args.push_back( make_pair( sizeof(cl_int), (void *)&iters )); args.push_back( make_pair( sizeof(cl_char), (void *)&calcErr )); - if (clCxt->supportsFeature(Context::CL_CPU)) + bool is_cpu; + queryDeviceInfo(IS_CPU_DEVICE, &is_cpu); + if (is_cpu) { openCLExecuteKernel(clCxt, &pyrlk, kernelName, globalThreads, localThreads, args, I.oclchannels(), I.depth(), (char*)" -D CPU"); releaseTexture(ITex);