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@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