VBO support in array SPU
Peter Djeu <[email protected]> Mon, 14 Mar 2005 17:17:00 -0600 (CST)
| Newsgroups | gmane.comp.graphics.chromium.devel |
|---|---|
| Message-ID | <[email protected]> |
Sorry if you receive this email more than once. I sent the original
version to the dev list about a week and a half ago (before I was a list
member), and that email still has not gone through the moderation process,
so I thought I'd resubmit. -- Peter
Here's the original message:
Hi, I've been working on Chromium for some time now trying to get Doom 3
to run smoothly on it. I added support for Vertex Buffer Objects (VBO's)
in the array SPU and wanted to submit my changes for review. I've tested
my modified version on a handful of applications that use VBO's and normal
vertex arrays, and it seems OK so far. Here's what I've included:
1. Attached, an archive containing patches to the array SPU that adds
support for regular VBO arays and for VBO element arrays. A minor
(hopefully correct) fix is also included for the buffer object in the
state tracker. This patch is diff'd with the cvs repository from Mar 1.
2. Below, a summary of what changes I made and where, for anyone
interested.
3. Below, questions I came across while putting together the patch. If
anyone could answer these, I'd really appreciate it.
Sincerely,
Peter Djeu
<<< Summary >>>
spu/array/arrayspu.c
- For the array SPU -- added offset calculations whenever a client
pointer has valid data in its VBO data ptr. All uses are protected by a
#define guard so that the calculations are only done when the Vertex
Bufffer Object extension is enabled in cr_version.h.
- Added missing gl function "IndexPointer" to pass along the color index
pointer to crStateIndexPointer().
- Added gl functions to pass along all VBO interface calls to the
corresponding state tracker functions.
- Added support in DrawElements() for Vertex Buffer Object element
arrays.
spu/array/arrayspu_init.c
- For the array SPU -- on context initialization, if the Vertex Buffer
Object extension is enabled, set the buffer object's retainData flag to
GL_TRUE.
state_tracker/state_bufferobject.c
- In the state tracker for VBO's -- when the null buffer is first
initialized in crStateBufferObjectInit(), its reference count is set to 2.
However, if the arrayBuffer and elementsBuffer both enter use, then the
nullBuffer reference count drops to 0, which causes an unnecessary attempt
to remove it from the hash table every time it is swapped out. A fix is
added to set the reference count to 3 on initialization (this also makes
more sense since the nullBuffer is being pointed to by 3 pointers anyway).
- In crStateDeleteBuffersARB(), added a line to increment the reference
count of the nullBuffer when it replaces either arrayBuffer or
elementsBuffer. Otherwise, repeated swapping out of the nullBuffer causes
its reference count to wrap around, which is harmless although odd.
<<< Questions >>>
Each question is preceded by the file it pertains to.
* state_tracker/state_bufferobject.c
- Why are there ref counts within CRBufferObject's? We can't free the
data associated with a buffer or remove it from the hashtable unless the
buffer is explicitly deleted by a DeleteBuffersARB call, so it seems
unusual what there is even logic present that frees a buffer when its ref
count drops to zero. Also, because the buffer object initializer starts
the refcount at 1 and it immediately gets incremented to 2
(newObj->refCount++;) in crStateBindBufferARB(), no buffer object, except
for the nullBuffer, will ever get swapped out enough times for its ref
count to reach zero.
* spu/array/arrayspu.c
- Is it customary to NOT put #define guards around entire GL functions
in a SPU, but to use them within the body of a parent function call? For
example, use of the fog coordinate pointer is protected with a "#ifdef
CR_EXT_fog_coord" guard within arrayspu_ArrayElement(). However, at the
top level, the function arrayspu_FogCoordPointerEXT(), at both its
definition and listing in the SPU's named function table, do not have this
guard. I have tried to follow the existing standard in the current patch,
but I can submit an update if using the missing guards everywhere is more
correct.
* opengl_stub/wgl.c
- I had a lot of trouble (on Windows) trying to get Chromium to choose
the right pixel format for the render window (it was always selecting
Pixel Format 1, despite the visual attributes I was asking for via the
render SPU). Is there some easy way to set the pixel format? I
ultimately hacked on opengl_stub/wgl.c until it worked, but I didn't
include these changes in this patch because there might have been a good
reason for always using Pixel Format 1. I'm using an NV40 card on Windows
XP, in case that helps.
EOF
vbo_diffs.tar.gz
(application/octet-stream, 2.5 KB) - not displayed