diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index 9c3b4faf64..78837dc708 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -248,6 +248,7 @@ public: const Device& device(size_t idx) const; Program getProg(const ProgramSource& prog, const String& buildopt, String& errmsg); + void unloadProg(Program& prog); static Context& getDefault(bool initialize = true); void* ptr() const; diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 14a90c68f4..309ef88919 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1380,6 +1380,23 @@ struct Context::Impl return prog; } + void unloadProg(Program& prog) + { + cv::AutoLock lock(program_cache_mutex); + for (CacheList::iterator i = cacheList.begin(); i != cacheList.end(); ++i) + { + phash_t::iterator it = phash.find(*i); + if (it != phash.end()) + { + if (it->second.ptr() == prog.ptr()) + { + phash.erase(*i); + cacheList.erase(i); + return; + } + } + } + } IMPLEMENT_REFCOUNTABLE(); @@ -1643,7 +1660,11 @@ Program Context::getProg(const ProgramSource& prog, return p ? p->getProg(prog, buildopts, errmsg) : Program(); } - +void Context::unloadProg(Program& prog) +{ + if (p) + p->unloadProg(prog); +} #ifdef HAVE_OPENCL_SVM bool Context::useSVM() const