[Mesa-dev] vertex array regression
Brian Paul
brian.e.paul at gmail.com
Thu Dec 15 13:36:24 PST 2011
2011/12/15 Mathias Fröhlich <Mathias.Froehlich at web.de>:
>
> Brian,
>
> On Thursday, December 15, 2011 17:08:57 Brian Paul wrote:
>> There's a regression in vertex array drawing with this commit:
>>
>> commit ed42c2580717527b2005580940fc766d95bb6b0b
>> Author: Mathias Fröhlich <Mathias.Froehlich at web.de>
>> Date: Mon Oct 31 16:23:40 2011 +0100
>>
>> vbo: Use The VERT_{ATTRIB,BIT} defines.
>>
>> Signed-off-by: Mathias Froehlich <Mathias.Froehlich at web.de>
>> Reviewed-by: Brian Paul <brianp at vmware.com>
>> Reviewed-by: Eric Anholt <eric at anholt.net>
>>
>>
>> To see the problem, run mesa/demos/src/demos/isosurf, choose
>> "glDrawArrays" or "glDrawElements" from the pop-up menu (right mouse
>> button). I see the problem (random/missing vertices or failed
>> assertion) with all gallium drivers. The swrast/i965 drivers seem
>> uneffected.
>>
>> I'll try to debug it further, but maybe you could double-check your work.
>
> I will look into that. Probably not today but latest at the weekend.
I found the problem. It's this chunk in vbo_context.c:
@@ -182,14 +177,15 @@ GLboolean _vbo_CreateContext( struct gl_context *ctx )
GLuint i;
/* When no vertex program, pull in the material attributes in
- * the 16..32 generic range.
+ * the generic range.
*/
- for (i = 0; i < 16; i++)
+ for (i = 0; i < VERT_ATTRIB_FF_MAX; i++)
vbo->map_vp_none[i] = i;
- for (i = 0; i < 12; i++)
- vbo->map_vp_none[16+i] = VBO_ATTRIB_MAT_FRONT_AMBIENT + i;
- for (i = 0; i < 4; i++)
- vbo->map_vp_none[28+i] = i;
+ for (i = 0; i < NR_MAT_ATTRIBS; i++)
+ vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)]
+ = VBO_ATTRIB_MAT_FRONT_AMBIENT + i;
+ for (i = NR_MAT_ATTRIBS; i < VERT_ATTRIB_GENERIC_MAX; i++)
+ vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)] = i;
for (i = 0; i < Elements(vbo->map_vp_arb); i++)
vbo->map_vp_arb[i] = i;
Or more precisely:
- for (i = 0; i < 4; i++)
- vbo->map_vp_none[28+i] = i;
+ for (i = NR_MAT_ATTRIBS; i < VERT_ATTRIB_GENERIC_MAX; i++)
+ vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)] = i;
This change resulted in a different mapping in the map_vp_none[] array.
The original code produced:
vbo->map_vp_none = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 1, 2, 3}
The new code produces:
vbo->map_vp_none = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 12, 13, 14,
15}
The last four/five elements are different. Though, I don't really
know what their purpose is. It seems to me that they could/should
just be identity entries, ex: map_vp_none[i]=i as is the case for the
map_vp_arb[] array.
And I found that simply removing those lines fixes the problem:
@@ -184,8 +184,6 @@ GLboolean _vbo_CreateContext( struct gl_context *ctx )
for (i = 0; i < NR_MAT_ATTRIBS; i++)
vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)]
= VBO_ATTRIB_MAT_FRONT_AMBIENT + i;
- for (i = NR_MAT_ATTRIBS; i < VERT_ATTRIB_GENERIC_MAX; i++)
- vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)] = i;
for (i = 0; i < Elements(vbo->map_vp_arb); i++)
vbo->map_vp_arb[i] = i;
For fixed function, the point is to simply place the per-vertex
material attributes in the generic attribute arrays. There are 12
such material attributes. So there's four slots left over.
-Brian
More information about the mesa-dev
mailing list