Confused as to how generate-gl-function works
Chris Bagley
chris.bagley at gmail.com
Wed Oct 16 11:45:02 UTC 2013
Or is it that once the lambda is compiled, it replaces the version with
generate-gl-function in it? Does that mean that the wrapper functions are
compiled on first call?
On 16 October 2013 13:42, Chris Bagley <chris.bagley at gmail.com> wrote:
> It seems to be compiling a new lambda on every call. I'll walk through my
> logic below:
>
> So I am looking at how (gen-buffers) is implemented.
>
> (defun gen-buffers (count)
> (with-foreign-object (buffer-array '%gl:uint count)
> (%gl:gen-buffers count buffer-array)
> (loop for i below count
> collecting (mem-aref buffer-array '%gl:uint i))))
>
> %gl:gen-buffers is deifned as
> (defglextfun ("glGenBuffers" gen-buffers) :void
> (n sizei)
> (buffers (:pointer uint)))
>
> which expands to:
> (progn
> (declaim (notinline gen-buffers))
> (defun gen-buffers (n buffers)
> (generate-gl-function "glgenbuffers" 'gen-buffers ':void
> '((n sizei) (buffers (:pointer uint))) n buffers))
> (setf (get 'gen-buffers 'proc-address-dummy) #'gen-buffers)
> 'gen-buffers)
>
> and generate-gl-function
> (defun generate-gl-function (foreign-name lisp-name result-type body &rest
> args)
> (let ((address (gl-get-proc-address foreign-name))
> (arg-list (mapcar #'first body)))
> (when (or (not (pointerp address)) (null-pointer-p address))
> (error "Couldn't find function ~A" foreign-name))
> (compile lisp-name
> `(lambda ,arg-list
> (multiple-value-prog1
> (foreign-funcall-pointer
> ,address
> (:library opengl)
> ,@(loop for i in body
> collect (second i)
> collect (first i))
> ,result-type)
> #-cl-opengl-no-check-error
> (check-error ',lisp-name))))
> (apply lisp-name args)))
>
> What is going on here? I don't believe that it is recompiling the wrapper
> function on every call, but I'm having issues working out how else this
> works.
> Hope someone can help me out here.
> Cheers
> Baggers
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cl-opengl-devel/attachments/20131016/518c756c/attachment.html>
More information about the cl-opengl-devel
mailing list