Fix opengl buffer objects leak
This commit is contained in:
parent
0ff12bc9ed
commit
7c077ebe68
1 changed files with 35 additions and 31 deletions
|
|
@ -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)))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue