--- OpenCL/OpenCL.xs 2012/04/29 18:39:31 1.58 +++ OpenCL/OpenCL.xs 2012/04/30 09:38:53 1.60 @@ -1560,8 +1560,8 @@ void acquire_gl_objects (OpenCL::Queue self, SV *objects, ...) ALIAS: + release_gl_objects = 1 enqueue_acquire_gl_objects = 0 - ALIAS: enqueue_release_gl_objects = 1 PPCODE: if (!SvROK (objects) || SvTYPE (SvRV (objects)) != SVt_PVAV) @@ -2195,6 +2195,7 @@ cl_event ce; } arg; size_t size; + int nullarg = 0; switch (type) { @@ -2210,17 +2211,20 @@ case 'h': arg.ch = SvUV (sv); size = sizeof (arg.ch); break; case 'f': arg.cf = SvNV (sv); size = sizeof (arg.cf); break; case 'd': arg.cd = SvNV (sv); size = sizeof (arg.cd); break; - case 'z': arg.cz = SvUV (sv); size = sizeof (arg.cz); break; - case 'm': arg.cm = SvCLOBJ ("OpenCL::Kernel::setf", "m", sv, "OpenCL::Memory" ); size = sizeof (arg.cm); break; - case 'a': arg.ca = SvCLOBJ ("OpenCL::Kernel::setf", "a", sv, "OpenCL::Sampler"); size = sizeof (arg.ca); break; - case 'e': arg.ca = SvCLOBJ ("OpenCL::Kernel::setf", "e", sv, "OpenCL::Event" ); size = sizeof (arg.ce); break; + case 'z': nullarg = 1; size = SvIV (sv); break; + + case 'm': nullarg = !SvOK (sv); arg.cm = SvCLOBJ ("OpenCL::Kernel::setf", "m", sv, "OpenCL::Memory" ); size = sizeof (arg.cm); break; + case 'a': nullarg = !SvOK (sv); arg.ca = SvCLOBJ ("OpenCL::Kernel::setf", "a", sv, "OpenCL::Sampler"); size = sizeof (arg.ca); break; + case 'e': nullarg = !SvOK (sv); arg.ca = SvCLOBJ ("OpenCL::Kernel::setf", "e", sv, "OpenCL::Event" ); size = sizeof (arg.ce); break; default: croak ("OpenCL::Kernel::setf format character '%c' not supported", type); } - clSetKernelArg (self, i - 2, size, &arg); + res = clSetKernelArg (self, i - 2, size, nullarg ? 0 : &arg); + if (res) + croak ("OpenCL::Kernel::setf kernel parameter '%c' (#%d): %s", type, i - 2, err2str (res)); } if (i != items) @@ -2284,12 +2288,12 @@ void set_memory (OpenCL::Kernel self, cl_uint idx, OpenCL::Memory_ornull value) CODE: - clSetKernelArg (self, idx, sizeof (value), &value); + clSetKernelArg (self, idx, sizeof (value), value ? &value : 0); void set_buffer (OpenCL::Kernel self, cl_uint idx, OpenCL::Buffer_ornull value) CODE: - clSetKernelArg (self, idx, sizeof (value), &value); + clSetKernelArg (self, idx, sizeof (value), value ? &value : 0); void set_image (OpenCL::Kernel self, cl_uint idx, OpenCL::Image_ornull value) @@ -2297,7 +2301,7 @@ set_image2d = 0 set_image3d = 0 CODE: - clSetKernelArg (self, idx, sizeof (value), &value); + clSetKernelArg (self, idx, sizeof (value), value ? &value : 0); void set_sampler (OpenCL::Kernel self, cl_uint idx, OpenCL::Sampler value)