fix for PR 2196
authorIlya Lavrenov <ilya.lavrenov@itseez.com>
Wed, 29 Jan 2014 21:47:25 +0000 (01:47 +0400)
committerIlya Lavrenov <ilya.lavrenov@itseez.com>
Wed, 29 Jan 2014 21:47:25 +0000 (01:47 +0400)
modules/core/src/ocl.cpp

index 7201fca..1a39c99 100644 (file)
@@ -2704,10 +2704,12 @@ bool Kernel::empty() const
 
 int Kernel::set(int i, const void* value, size_t sz)
 {
+    if (!p || !p->handle)
+        return -1;
     CV_Assert(i >= 0);
     if( i == 0 )
         p->cleanupUMats();
-    if( !p || !p->handle || clSetKernelArg(p->handle, (cl_uint)i, sz, value) < 0 )
+    if( clSetKernelArg(p->handle, (cl_uint)i, sz, value) < 0 )
         return -1;
     return i+1;
 }
@@ -2725,9 +2727,9 @@ int Kernel::set(int i, const UMat& m)
 
 int Kernel::set(int i, const KernelArg& arg)
 {
-    CV_Assert( i >= 0 );
     if( !p || !p->handle )
         return -1;
+    CV_Assert( i >= 0 );
     if( i == 0 )
         p->cleanupUMats();
     if( arg.m )
@@ -2737,6 +2739,13 @@ int Kernel::set(int i, const KernelArg& arg)
         bool ptronly = (arg.flags & KernelArg::PTR_ONLY) != 0;
         cl_mem h = (cl_mem)arg.m->handle(accessFlags);
 
+        if (!h)
+        {
+            p->release();
+            p = 0;
+            return -1;
+        }
+
         if (ptronly)
             clSetKernelArg(p->handle, (cl_uint)i++, sizeof(h), &h);
         else if( arg.m->dims <= 2 )