]> granicus.if.org Git - imagemagick/commitdiff
GetAuthenticOpenCLBuffer will now increase the ref count on the buffer.
authorDirk Lemstra <dirk@git.imagemagick.org>
Wed, 25 Oct 2017 05:22:41 +0000 (07:22 +0200)
committerDirk Lemstra <dirk@git.imagemagick.org>
Wed, 25 Oct 2017 05:22:41 +0000 (07:22 +0200)
MagickCore/accelerate.c
MagickCore/cache.c
MagickCore/opencl-private.h
MagickCore/opencl.c

index d1cfeab8bb40731c1013e415f14676e8356dd03c..4ce3dbafdf7ff9b4b60c89f660b486c27984dca9 100644 (file)
@@ -448,6 +448,8 @@ static Image *ComputeAddNoiseImage(const Image *image,MagickCLEnv clEnv,
     numRandPerChannel;
 
   filteredImage=NULL;
+  imageBuffer=NULL;
+  filteredImageBuffer=NULL;
   addNoiseKernel=NULL;
   outputReady=MagickFalse;
 
@@ -548,6 +550,10 @@ static Image *ComputeAddNoiseImage(const Image *image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
+  if (filteredImageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(filteredImageBuffer);
   if (addNoiseKernel != (cl_kernel) NULL)
     ReleaseOpenCLKernel(addNoiseKernel);
   if (queue != (cl_command_queue) NULL)
@@ -639,6 +645,8 @@ static Image *ComputeBlurImage(const Image* image,MagickCLEnv clEnv,
     lsize[2];
 
   filteredImage=NULL;
+  imageBuffer=NULL;
+  filteredImageBuffer=NULL;
   tempImageBuffer=NULL;
   imageKernelBuffer=NULL;
   blurRowKernel=NULL;
@@ -744,6 +752,10 @@ static Image *ComputeBlurImage(const Image* image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
+  if (filteredImageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(filteredImageBuffer);
   if (tempImageBuffer != (cl_mem) NULL)
     ReleaseOpenCLMemObject(tempImageBuffer);
   if (imageKernelBuffer != (cl_mem) NULL)
@@ -830,6 +842,7 @@ static MagickBooleanType ComputeContrastImage(Image *image,MagickCLEnv clEnv,
     i;
 
   contrastKernel=NULL;
+  imageBuffer=NULL;
   outputReady=MagickFalse;
 
   device=RequestOpenCLDevice(clEnv);
@@ -868,6 +881,8 @@ static MagickBooleanType ComputeContrastImage(Image *image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
   if (contrastKernel != (cl_kernel) NULL)
     ReleaseOpenCLKernel(contrastKernel);
   if (queue != (cl_command_queue) NULL)
@@ -2719,6 +2734,7 @@ static MagickBooleanType ComputeFunctionImage(Image *image,MagickCLEnv clEnv,
 
   outputReady=MagickFalse;
 
+  imageBuffer=NULL;
   functionKernel=NULL;
   parametersBuffer=NULL;
 
@@ -2778,6 +2794,8 @@ static MagickBooleanType ComputeFunctionImage(Image *image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
   if (parametersBuffer != (cl_mem) NULL)
     ReleaseOpenCLMemObject(parametersBuffer);
   if (functionKernel != (cl_kernel) NULL)
@@ -2857,6 +2875,7 @@ static MagickBooleanType ComputeGrayscaleImage(Image *image,MagickCLEnv clEnv,
     i;
 
   outputReady=MagickFalse;
+  imageBuffer=NULL;
   grayscaleKernel=NULL;
 
   assert(image != (Image *) NULL);
@@ -2899,6 +2918,8 @@ static MagickBooleanType ComputeGrayscaleImage(Image *image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
   if (grayscaleKernel != (cl_kernel) NULL)
     ReleaseOpenCLKernel(grayscaleKernel);
   if (queue != (cl_command_queue) NULL)
@@ -4289,6 +4310,8 @@ static Image *ComputeResizeImage(const Image* image,MagickCLEnv clEnv,
     i;
 
   filteredImage=NULL;
+  imageBuffer=NULL;
+  filteredImageBuffer=NULL;
   tempImageBuffer=NULL;
   cubicCoefficientsBuffer=NULL;
   outputReady=MagickFalse;
@@ -4382,6 +4405,10 @@ static Image *ComputeResizeImage(const Image* image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
+  if (filteredImageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(filteredImageBuffer);
   if (tempImageBuffer != (cl_mem) NULL)
     ReleaseOpenCLMemObject(tempImageBuffer);
   if (cubicCoefficientsBuffer != (cl_mem) NULL)
@@ -4501,6 +4528,8 @@ static Image* ComputeRotationalBlurImage(const Image *image,MagickCLEnv clEnv,
     i;
 
   filteredImage=NULL;
+  imageBuffer=NULL;
+  filteredImageBuffer=NULL;
   sinThetaBuffer=NULL;
   cosThetaBuffer=NULL;
   rotationalBlurKernel=NULL;
@@ -4591,6 +4620,10 @@ static Image* ComputeRotationalBlurImage(const Image *image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
+  if (filteredImageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(filteredImageBuffer);
   if (sinThetaBuffer != (cl_mem) NULL)
     ReleaseOpenCLMemObject(sinThetaBuffer);
   if (cosThetaBuffer != (cl_mem) NULL)
@@ -4693,6 +4726,8 @@ static Image *ComputeUnsharpMaskImage(const Image *image,MagickCLEnv clEnv,
     lsize[2];
 
   filteredImage=NULL;
+  imageBuffer=NULL;
+  filteredImageBuffer=NULL;
   tempImageBuffer=NULL;
   imageKernelBuffer=NULL;
   blurRowKernel=NULL;
@@ -4809,6 +4844,10 @@ static Image *ComputeUnsharpMaskImage(const Image *image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
+  if (filteredImageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(filteredImageBuffer);
   if (tempImageBuffer != (cl_mem) NULL)
     ReleaseOpenCLMemObject(tempImageBuffer);
   if (imageKernelBuffer != (cl_mem) NULL)
@@ -4870,6 +4909,8 @@ static Image *ComputeUnsharpMaskImageSingle(const Image *image,
     lsize[2];
 
   filteredImage=NULL;
+  imageBuffer=NULL;
+  filteredImageBuffer=NULL;
   imageKernelBuffer=NULL;
   unsharpMaskKernel=NULL;
   outputReady=MagickFalse;
@@ -4933,6 +4974,10 @@ static Image *ComputeUnsharpMaskImageSingle(const Image *image,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
+  if (filteredImageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(filteredImageBuffer);
   if (imageKernelBuffer != (cl_mem) NULL)
     ReleaseOpenCLMemObject(imageKernelBuffer);
   if (unsharpMaskKernel != (cl_kernel) NULL)
@@ -5027,6 +5072,8 @@ static Image *ComputeWaveletDenoiseImage(const Image *image,MagickCLEnv clEnv,
     x;
 
   filteredImage=NULL;
+  imageBuffer=NULL;
+  filteredImageBuffer=NULL;
   denoiseKernel=NULL;
   queue=NULL;
   outputReady=MagickFalse;
@@ -5100,6 +5147,10 @@ static Image *ComputeWaveletDenoiseImage(const Image *image,MagickCLEnv clEnv,
 
 cleanup:
 
+  if (imageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(imageBuffer);
+  if (filteredImageBuffer != (cl_mem) NULL)
+    ReleaseOpenCLMemObject(filteredImageBuffer);
   if (denoiseKernel != (cl_kernel) NULL)
     ReleaseOpenCLKernel(denoiseKernel);
   if (queue != (cl_command_queue) NULL)
index 08e3cf1afc014afab766c6ac2fa1c77a3794c87e..e8f0ad6c6aa3c6a0be46ce316f9be2d042811ba2 100644 (file)
@@ -1173,6 +1173,8 @@ MagickPrivate cl_mem GetAuthenticOpenCLBuffer(const Image *image,
       cache_info->opencl=AcquireMagickCLCacheInfo(device,cache_info->pixels,
         cache_info->length);
     }
+  if (cache_info->opencl != (MagickCLCacheInfo) NULL)
+    RetainOpenCLMemObject(cache_info->opencl->buffer);
   UnlockSemaphoreInfo(cache_info->semaphore);
   if (cache_info->opencl == (MagickCLCacheInfo) NULL)
     return((cl_mem) NULL);
index ee654e366d03ca6ee78aa08d3bc61fd6677cf190..3146eef600388bc58f1968286bb5015ebd2560bf 100644 (file)
@@ -123,6 +123,10 @@ typedef CL_API_ENTRY cl_mem
     cl_mem_flags flags,size_t size,void *host_ptr,cl_int *errcode_ret)
     CL_API_SUFFIX__VERSION_1_0;
 
+typedef CL_API_ENTRY cl_int
+  (CL_API_CALL *MAGICKpfn_clRetainMemObject)(cl_mem memobj)
+    CL_API_SUFFIX__VERSION_1_0;
+
 typedef CL_API_ENTRY cl_int
   (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj)
     CL_API_SUFFIX__VERSION_1_0;
@@ -259,6 +263,7 @@ struct MagickLibraryRec
   MAGICKpfn_clFinish                  clFinish;
 
   MAGICKpfn_clCreateBuffer            clCreateBuffer;
+  MAGICKpfn_clRetainMemObject         clRetainMemObject;
   MAGICKpfn_clReleaseMemObject        clReleaseMemObject;
 
   MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
@@ -453,7 +458,8 @@ extern MagickPrivate void
   ReleaseOpenCLDevice(MagickCLDevice),
   ReleaseOpenCLKernel(cl_kernel),
   ReleaseOpenCLMemObject(cl_mem),
-  RetainOpenCLEvent(cl_event);
+  RetainOpenCLEvent(cl_event),
+  RetainOpenCLMemObject(cl_mem);
 
 #endif
 
index 019f93f74d9dfd25d52300ef04adb1d7c121581f..1f8815f8c29f89522392a643736f155ed670922f 100644 (file)
@@ -478,6 +478,11 @@ MagickPrivate void ReleaseOpenCLMemObject(cl_mem memobj)
   (void) openCL_library->clReleaseMemObject(memobj);
 }
 
+MagickPrivate void RetainOpenCLMemObject(cl_mem memobj)
+{
+  (void) openCL_library->clRetainMemObject(memobj);
+}
+
 MagickPrivate cl_int SetOpenCLKernelArg(cl_kernel kernel,size_t arg_index,
   size_t arg_size,const void *arg_value)
 {
@@ -2460,6 +2465,7 @@ static MagickBooleanType BindOpenCLFunctions()
 
   BIND(clCreateBuffer);
   BIND(clReleaseMemObject);
+  BIND(clRetainMemObject);
 
   BIND(clCreateContext);
   BIND(clReleaseContext);