diff options
author | Brian Paul <[email protected]> | 2012-04-02 20:05:16 +0200 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2012-07-06 10:09:00 -0700 |
commit | 1ce1a4526f3af818ef6a3934a0ff0d192f818376 (patch) | |
tree | cee9db513093cfe2bd4f2812d0a0d8441db49655 | |
parent | e0e1ca353b9b77f328d1afa2480ccbffbbea7143 (diff) |
st/mesa: fix max_offset computation for base vertex
Add the maximum base vertex offset to max_index for computing the
buffer size. Fixes a failed assertion in the u_upload_mgr.c code with
the VMware svga driver.
Fixes https://bugs.freedesktop.org/show_bug.cgi?id=48141
v2: incorporate Marek's suggestions.
NOTE: This is a candidate for the 8.0 branch.
Reviewed-by: Marek Olšák <[email protected]>
(cherry picked from commit 299c9052e832712654865af8dbd0ed4bf055d124)
-rw-r--r-- | src/mesa/state_tracker/st_draw.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 6d6fc858de4..fb2b6f9160f 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -979,6 +979,7 @@ st_draw_vbo(struct gl_context *ctx, struct pipe_index_buffer ibuffer; struct pipe_draw_info info; unsigned i, num_instances = 1; + unsigned max_index_plus_base; GLboolean new_array = st->dirty.st && (st->dirty.mesa & (_NEW_ARRAY | _NEW_PROGRAM | _NEW_BUFFER_OBJECT)) != 0; @@ -987,6 +988,8 @@ st_draw_vbo(struct gl_context *ctx, assert(ctx->NewState == 0x0); if (ib) { + int max_base_vertex = 0; + /* Gallium probably doesn't want this in some cases. */ if (!index_bounds_valid) if (!all_varyings_in_vbos(arrays)) @@ -994,7 +997,16 @@ st_draw_vbo(struct gl_context *ctx, for (i = 0; i < nr_prims; i++) { num_instances = MAX2(num_instances, prims[i].num_instances); + max_base_vertex = MAX2(max_base_vertex, prims[i].basevertex); } + + /* Compute the sum of max_index and max_base_vertex. That's the value + * we need to use when creating buffers. + */ + if (max_index == ~0) + max_index_plus_base = max_index; + else + max_index_plus_base = max_index + max_base_vertex; } else { /* Get min/max index for non-indexed drawing. */ @@ -1006,6 +1018,9 @@ st_draw_vbo(struct gl_context *ctx, max_index = MAX2(max_index, prims[i].start + prims[i].count - 1); num_instances = MAX2(num_instances, prims[i].num_instances); } + + /* The base vertex offset only applies to indexed drawing */ + max_index_plus_base = max_index; } /* Validate state. */ @@ -1025,7 +1040,8 @@ st_draw_vbo(struct gl_context *ctx, st_validate_state(st); if (new_array) { - if (!st_validate_varrays(ctx, arrays, max_index, num_instances)) { + if (!st_validate_varrays(ctx, arrays, max_index_plus_base, + num_instances)) { /* probably out of memory, no-op the draw call */ return; } @@ -1049,7 +1065,7 @@ st_draw_vbo(struct gl_context *ctx, unsigned element_size = st->user_attrib[i].element_size; unsigned stride = st->user_attrib[i].stride; unsigned min_offset = min_index * stride; - unsigned max_offset = max_index * stride + element_size; + unsigned max_offset = max_index_plus_base * stride + element_size; assert(max_offset > min_offset); |