[cl-opengl-devel] Re: a patch to add a support for the Vertex Arrays
Denys Rtveliashvili
rtvd at mail.ru
Thu May 10 04:41:59 UTC 2007
> That example hasn't been updated yet. Try
> examples/misc/opengl-array.lisp instead.
Thank you Luis,
The demo works for me and now it is clear how it works (in most
aspects). So I can compare the implementation in the cl-opengl-thomas
branch with mine.
I will use "T" as an alias for the cl-opengl-thomas branch and "D" as an
alias for mine.
MEMORY CONTAINERS
-----------------
T: Any manipulations on vertex arrays are made in native memory. The
arrays are typed in a very nice manner (and I guess this is made thanks
to the features from the new CFFI).
D: The vertex arrays are stored in memory structures native to LISP (1D
and 2D arrays, sequences). The arrays are typed at the point of the
actual declaration of arrays to the OpenGL when the implementation
implicitly copies the data to the native arrays. A support for direct
native arrays can be added, but that's not yet ready.
MEMORY MANAGEMENT
-----------------
In both cases the memory management is performed correctly in the sense
that the arrays are available for the OpenGL whenever it needs it.
However...
T: The memory must be allocated and freed explicitly.
D: The memory is allocated and deallocated implicitly unless user
requires something else.
CLIENT STATE MANAGEMENT
-----------------------
T: The client state is managed using enable/disable-client-state functions.
D: The client state is managed automatically. When a vertex array is
declared, the respective client state is turned on. When it is declared
to be null, the client state is turned off.
SUPPORT FOR DIFFERENT KINDS OF VERTEX ARRAYS
--------------------------------------------
T: At least the "vertex array" is supported. It is not clear for me if
the rest of arrays like color arrays and edge flag arrays are supported.
Probably they are not.
D: All kinds of vertex arrays are supported.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MY CONCERNS
-----------
For me, the main concern regarding the approach in cl-opengl-thomas
branch is that the speed of memory access for this new kind of native
arrays is questionable. You see, before implementing the support for
Vertex Arrays I spent a day with the SBCL trying to figure out what is
the fastest way to access the native arrays. The disassembled code does
not look great even for ordinary typed LISP arrays. For simple 1D native
arrays is is slightly worse. And for the memory access like this:
(setf (gl:glaref (vertex-array w) i 'r) 255)
The "disassemble" shows and enormous listing. That's because there is a
sequence of function calls just to fill out a cell in the array.
PROPOSED SOLUTION
-----------------
I propose a hybrid solution which will allow for both ease of use and
efficiency.
MEMORY CONTAINERS & MEMORY MANAGEMENT
-------------------------------------
An approach closed to solution D is used, so that it is possible to use
data structures native to LISP and provide a fast way of doing things.
However, the code is modified in a way that if a user wants to use a
native array directly, he can do it. In such case, it is the native
arrays passed to the respective function which is declared to the
OpenGL. Otherwise, the data structure will be copied to the native array
and managed automatically.
This will give benefits of both approaches.
CLIENT STATE MANAGEMENT
-----------------------
I'd prefer an automatic one, but I do not insist on it in any way. :-)
Please, let me know what you think.
I am looking forward for the most high-performance 3D in LISP so an
effective an usable support for Vertex Arrays / shaders / etc. is very
interesting for me.
Thank you,
Denys Rtveliashvili
P.S. And by the way, can the new features from cffi-newtypes be merged
into the main CFFI?
More information about the cl-opengl-devel
mailing list