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

Reply via email to