def run(self, queue, length, *args, **kwargs):
        """
        run the kernel without acquiring interop objects.
        """
        if self._kernel is None:
            self.build()

        arguments = kernel_helpers.create_knl_args_ordered(self._kernel_args, args, kwargs)
        getattr(self._kernel, self.kernel_name)(queue, tuple([int(a) for a in self.size]), None, *arguments)
    def run_acquired(self, queue, length, *args, **kwargs):
        """
        run the kernel with acquired interop objects.
        all objects in argument of type cl.GL* will be acquire and released.

            cl.enqueue_acquire_gl_objects(...)
            kernel()
            cl.enqueue_release_gl_objects(...)
        """
        if self._kernel is None:
            self.build()

        arguments = kernel_helpers.create_knl_args_ordered(self._kernel_args, args, kwargs)
        enq = [a for a in arguments if type(a) in [cl.GLTexture, cl.GLBuffer]]

        cl.enqueue_acquire_gl_objects(queue, enq)
        getattr(self._kernel, self.kernel_name)(queue, tuple([int(a) for a in self.size]), None, *arguments)
        cl.enqueue_release_gl_objects(queue, enq)
    def __call__(self, queue, length, *args, **kwargs):
        """
        invoke kernel
        """
        if self._kernel is None:
            self.build()

        if self._kernel_local is None:
            length = (length,) if type(length) is not tuple else length
        elif len(self._kernel_local) == 1:
            length = (length * self._kernel_local[0],)
        elif len(self._kernel_local) == 2:
            length = (length * self._kernel_local[0], self._kernel_local[1])
        elif len(self._kernel_local) == 3:
            length = (length * self._kernel_local[0], self._kernel_local[1], self._kernel_local[2])

        knl_args = kernel_helpers.create_knl_args_ordered(self._kernel_args, args, kwargs)
        return getattr(self._kernel, self.name)(queue, length, self._kernel_local, *knl_args)