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