diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 613179f8b..b46511e9b 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}; + enum {CL_DOUBLE, CL_UNIFIED_MEM, CL_VER_1_2}; bool supportsFeature(int ftype); size_t computeUnits(); void* oclContext(); diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index 856064c32..799c49c50 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -130,6 +130,7 @@ namespace cv cl_platform_id oclplatform; std::vector devices; std::vector devName; + std::string clVersion; cl_context oclcontext; cl_command_queue clCmdQueue; @@ -304,6 +305,7 @@ namespace cv char deviceName[256]; int devcienums = 0; + char clVersion[256]; for (unsigned i = 0; i < numPlatforms; ++i) { cl_uint numsdev; @@ -319,6 +321,8 @@ namespace cv Info ocltmpinfo; ocltmpinfo.impl->oclplatform = platforms[i]; + openCLSafeCall(clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION, sizeof(clVersion), clVersion, NULL)); + ocltmpinfo.impl->clVersion = clVersion; for(unsigned j = 0; j < numsdev; ++j) { ocltmpinfo.impl->devices.push_back(devices[j]); @@ -997,6 +1001,8 @@ namespace cv return impl->double_support == 1; case CL_UNIFIED_MEM: return impl->unified_memory == 1; + case CL_VER_1_2: + return impl->clVersion.find("OpenCL 1.2") != string::npos; default: return false; } diff --git a/modules/ocl/src/mcwutil.cpp b/modules/ocl/src/mcwutil.cpp index 15df8e044..ed3258b3d 100644 --- a/modules/ocl/src/mcwutil.cpp +++ b/modules/ocl/src/mcwutil.cpp @@ -124,7 +124,7 @@ namespace cv build_options, finish_mode); } - cl_mem bindTexture(const oclMat &mat) + cl_mem bindTexture(const oclMat &mat) { cl_mem texture; cl_image_format format; @@ -162,30 +162,37 @@ namespace cv CV_Error(-1, "Image forma is not supported"); break; } + if(Context::getContext()->supportsFeature(Context::CL_VER_1_2)) + { #if CL_VERSION_1_2 - cl_image_desc desc; - desc.image_type = CL_MEM_OBJECT_IMAGE2D; - desc.image_width = mat.cols; - desc.image_height = mat.rows; - desc.image_depth = 0; - desc.image_array_size = 1; - desc.image_row_pitch = 0; - desc.image_slice_pitch = 0; - desc.buffer = NULL; - desc.num_mip_levels = 0; - desc.num_samples = 0; - texture = clCreateImage((cl_context)mat.clCxt->oclContext(), CL_MEM_READ_WRITE, &format, &desc, NULL, &err); + cl_image_desc desc; + desc.image_type = CL_MEM_OBJECT_IMAGE2D; + desc.image_width = mat.cols; + desc.image_height = mat.rows; + desc.image_depth = 0; + desc.image_array_size = 1; + desc.image_row_pitch = 0; + desc.image_slice_pitch = 0; + desc.buffer = NULL; + desc.num_mip_levels = 0; + desc.num_samples = 0; + texture = clCreateImage((cl_context)mat.clCxt->oclContext(), CL_MEM_READ_WRITE, &format, &desc, NULL, &err); #else - texture = clCreateImage2D( - (cl_context)mat.clCxt->oclContext(), - CL_MEM_READ_WRITE, - &format, - mat.cols, - mat.rows, - 0, - NULL, - &err); + CV_Error(CV_StsBadFunc, "Non-deprecated image creation API call is not supported."); #endif + } + else + { + texture = clCreateImage2D( + (cl_context)mat.clCxt->oclContext(), + CL_MEM_READ_WRITE, + &format, + mat.cols, + mat.rows, + 0, + NULL, + &err); + } size_t origin[] = { 0, 0, 0 }; size_t region[] = { mat.cols, mat.rows, 1 }; @@ -198,7 +205,7 @@ namespace cv clEnqueueCopyBufferRect((cl_command_queue)mat.clCxt->oclCommandQueue(), (cl_mem)mat.data, devData, origin, origin, regin, mat.step, 0, mat.cols * mat.elemSize(), 0, 0, NULL, NULL); clFlush((cl_command_queue)mat.clCxt->oclCommandQueue()); - } + } else { devData = (cl_mem)mat.data; @@ -214,7 +221,6 @@ namespace cv openCLSafeCall(err); return texture; } - void releaseTexture(cl_mem& texture) { openCLFree(texture);