message: core(ocl): fix lifetime handling of Image kernel args
diff: @@ -2802,16 +2802,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();
  }
  @@ -2836,7 +2844,7 @@ struct Kernel::Impl
  bool isInProgress;
  bool isAsyncRun; // true if kernel was scheduled in async mode
  int nu;
  - std::list<Image2D> images;
  + std::vector<Image2D> shadow_images;
  bool haveTempDstUMats;
  bool haveTempSrcUMats;
  };
  @@ -2978,9 +2986,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)
  