Fix opengl buffer objects leak

This commit is contained in:
Renaud Casenave-Péré 2015-08-28 16:31:10 +02:00
parent 0ff12bc9ed
commit 7c077ebe68

View file

@ -52,34 +52,38 @@
(* (ctype-size (ctype stream)) (length (raw-data stream))))
(defun render-mesh (mesh program)
(loop for stream in (vertex-streams mesh)
with offset = 0
do (let* ((ctype (ctype stream)) (size (size stream)) (bsize (bsize stream))
(data (raw-data stream)) (attrib (attrib stream))
(ptr (foreign-alloc ctype :count size)))
;; create the data for opengl
(dotimes (i (length data))
(setf (mem-aref ptr ctype i) (aref data i)))
(let ((buffer-object (first (gl:gen-buffers 1))))
(gl:bind-buffer :array-buffer buffer-object)
(%gl:buffer-data :array-buffer bsize ptr :static-draw)
;; use it
(let ((loc (get-location program attrib)))
(gl-assert (gl:enable-vertex-attrib-array loc)
(gl:vertex-attrib-pointer loc 3 ctype :false 0 offset))
(incf offset bsize)
(foreign-free ptr)))))
(let* ((faces (faces mesh)) (data (raw-data faces))
(size (size faces)) (bsize (bsize faces))
(index-object (first (gl:gen-buffers 1)))
(ptr (foreign-alloc (ctype faces) :initial-contents data :count size)))
(gl:bind-buffer :element-array-buffer index-object)
(%gl:buffer-data :element-array-buffer bsize ptr :static-draw)
(foreign-free ptr)
(gl-assert (%gl:draw-elements (mode faces) bsize (ctype-to-gltype (ctype faces)) 0)))
;; cleanup data
(loop for stream in (vertex-streams mesh)
do (let ((loc (get-location program (attrib stream))))
(gl:disable-vertex-attrib-array loc)))
(gl:bind-buffer :element-array-buffer 0)
(gl:bind-buffer :array-buffer 0))
(let ((buffer-objects nil))
(loop for stream in (vertex-streams mesh)
with offset = 0
do (let* ((ctype (ctype stream)) (size (size stream)) (bsize (bsize stream))
(data (raw-data stream)) (attrib (attrib stream))
(ptr (foreign-alloc ctype :count size)))
;; create the data for opengl
(dotimes (i (length data))
(setf (mem-aref ptr ctype i) (aref data i)))
(let ((buffer-object (gl:gen-buffer)))
(push buffer-object buffer-objects)
(gl:bind-buffer :array-buffer buffer-object)
(%gl:buffer-data :array-buffer bsize ptr :static-draw)
;; use it
(let ((loc (get-location program attrib)))
(gl-assert (gl:enable-vertex-attrib-array loc)
(gl:vertex-attrib-pointer loc 3 ctype :false 0 offset))
(incf offset bsize)
(foreign-free ptr)))))
(let* ((faces (faces mesh)) (data (raw-data faces))
(size (size faces)) (bsize (bsize faces))
(index-object (gl:gen-buffer))
(ptr (foreign-alloc (ctype faces) :initial-contents data :count size)))
(push index-object buffer-objects)
(gl:bind-buffer :element-array-buffer index-object)
(%gl:buffer-data :element-array-buffer bsize ptr :static-draw)
(foreign-free ptr)
(gl-assert (%gl:draw-elements (mode faces) bsize (ctype-to-gltype (ctype faces)) 0)))
;; cleanup data
(loop for stream in (vertex-streams mesh)
do (let ((loc (get-location program (attrib stream))))
(gl:disable-vertex-attrib-array loc)))
(gl:delete-buffers buffer-objects)
(gl:bind-buffer :element-array-buffer 0)
(gl:bind-buffer :array-buffer 0)))