X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=modules%2Fcore%2Fsrc%2Focl.cpp;h=53b21e0f7797450212641421792f77d30332c520;hb=e85b41f9be29e9529fbb1bd9e218756274aa0ed1;hp=aaa0a788a3b6cd68a49e94aef5783e41a1469f56;hpb=ba3f150b14a21331912f36066127dbfdaa611efe;p=platform%2Fupstream%2Fopencv.git diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index aaa0a78..53b21e0 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1149,14 +1149,14 @@ void OpenCLExecutionContext::release() } + // true if we have initialized OpenCL subsystem with available platforms -static bool g_isOpenCLActivated = false; +static bool g_isOpenCLInitialized = false; +static bool g_isOpenCLAvailable = false; bool haveOpenCL() { CV_TRACE_FUNCTION(); - static bool g_isOpenCLInitialized = false; - static bool g_isOpenCLAvailable = false; if (!g_isOpenCLInitialized) { @@ -1178,7 +1178,7 @@ bool haveOpenCL() { cl_uint n = 0; g_isOpenCLAvailable = ::clGetPlatformIDs(0, NULL, &n) == CL_SUCCESS; - g_isOpenCLActivated = n > 0; + g_isOpenCLAvailable &= n > 0; CV_LOG_INFO(NULL, "OpenCL: found " << n << " platforms"); } catch (...) @@ -1214,7 +1214,7 @@ bool useOpenCL() bool isOpenCLActivated() { - if (!g_isOpenCLActivated) + if (!g_isOpenCLAvailable) return false; // prevent unnecessary OpenCL activation via useOpenCL()->haveOpenCL() calls return useOpenCL(); } @@ -3382,16 +3382,24 @@ struct Kernel::Impl haveTempSrcUMats = true; // UMat is created on RAW memory (without proper lifetime management, even from Mat) } - void addImage(const Image2D& image) + /// Preserve image lifetime (while it is specified as Kernel argument) + void registerImageArgument(int arg, const Image2D& image) { - images.push_back(image); + CV_CheckGE(arg, 0, ""); + CV_CheckLT(arg, (int)MAX_ARRS, ""); + if (arg < (int)shadow_images.size() && shadow_images[arg].ptr() != image.ptr()) // TODO future: replace ptr => impl (more strong check) + { + CV_Check(arg, !isInProgress, "ocl::Kernel: clearing of pending Image2D arguments is not allowed"); + } + shadow_images.reserve(MAX_ARRS); + shadow_images.resize(std::max(shadow_images.size(), (size_t)arg + 1)); + shadow_images[arg] = image; } void finit(cl_event e) { CV_UNUSED(e); cleanupUMats(); - images.clear(); isInProgress = false; release(); } @@ -3416,7 +3424,7 @@ struct Kernel::Impl bool isInProgress; bool isAsyncRun; // true if kernel was scheduled in async mode int nu; - std::list images; + std::vector shadow_images; bool haveTempDstUMats; bool haveTempSrcUMats; }; @@ -3558,9 +3566,11 @@ int Kernel::set(int i, const void* value, size_t sz) int Kernel::set(int i, const Image2D& image2D) { - p->addImage(image2D); cl_mem h = (cl_mem)image2D.ptr(); - return set(i, &h, sizeof(h)); + int res = set(i, &h, sizeof(h)); + if (res >= 0) + p->registerImageArgument(i, image2D); + return res; } int Kernel::set(int i, const UMat& m)