From f65e2915d8836fb03c758a631cb9a28ea74e2f3b Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Wed, 25 Oct 2017 07:22:41 +0200 Subject: [PATCH] GetAuthenticOpenCLBuffer will now increase the ref count on the buffer. --- MagickCore/accelerate.c | 51 +++++++++++++++++++++++++++++++++++++ MagickCore/cache.c | 2 ++ MagickCore/opencl-private.h | 8 +++++- MagickCore/opencl.c | 6 +++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/MagickCore/accelerate.c b/MagickCore/accelerate.c index d1cfeab8b..4ce3dbafd 100644 --- a/MagickCore/accelerate.c +++ b/MagickCore/accelerate.c @@ -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) diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 08e3cf1af..e8f0ad6c6 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -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); diff --git a/MagickCore/opencl-private.h b/MagickCore/opencl-private.h index ee654e366..3146eef60 100644 --- a/MagickCore/opencl-private.h +++ b/MagickCore/opencl-private.h @@ -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 diff --git a/MagickCore/opencl.c b/MagickCore/opencl.c index 019f93f74..1f8815f8c 100644 --- a/MagickCore/opencl.c +++ b/MagickCore/opencl.c @@ -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); -- 2.40.0