draw: do bounds checking of array elements (debug only)

Make sure that all the element indexes actually lie inside the vertex
buffer.

Also, rename pipe_run() to pipe_run_elts() to be more specific.

And assert/check the vertex count for the non-indexed case.
This commit is contained in:
Brian Paul
2010-07-29 17:24:20 -06:00
parent d88b6e19c1
commit b4c8de1ff2

View File

@@ -220,7 +220,7 @@ static void do_triangle( struct draw_context *draw,
do_point( draw, \
verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK) )
#define FUNC pipe_run
#define FUNC pipe_run_elts
#define ARGS \
struct draw_context *draw, \
unsigned prim, \
@@ -269,9 +269,24 @@ void draw_pipeline_run( struct draw_context *draw,
i < prim_info->primitive_count;
start += prim_info->primitive_lengths[i], i++)
{
unsigned count = prim_info->primitive_lengths[i];
const unsigned count = prim_info->primitive_lengths[i];
pipe_run(draw,
#if DEBUG
/* make sure none of the element indexes go outside the vertex buffer */
{
unsigned max_index = 0x0, i;
/* find the largest element index */
for (i = 0; i < count; i++) {
unsigned int index = (prim_info->elts[start + i]
& ~DRAW_PIPE_FLAG_MASK);
if (index > max_index)
max_index = index;
}
assert(max_index <= vert_info->count);
}
#endif
pipe_run_elts(draw,
prim_info->prim,
vert_info->verts,
vert_info->stride,
@@ -378,6 +393,8 @@ void draw_pipeline_run_linear( struct draw_context *draw,
draw->pipeline.vertex_stride = vert_info->stride;
draw->pipeline.vertex_count = count;
assert(count <= vert_info->count);
pipe_run_linear(draw,
prim_info->prim,
(struct vertex_header*)verts,