Confused as to how generate-gl-function works

Chris Bagley chris.bagley at gmail.com
Wed Oct 16 11:42:42 UTC 2013


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/38202163/attachment.html>


More information about the cl-opengl-devel mailing list