i965/draw: Stop relying on min_index == -1 for invalid index bounds
The vbo layer passes an index_bounds_valid flag that we should be using instead. This also fixes a bug when min_index == -1 and basevertex != 0 where we were actually comparing min_index + basevertex == -1 which was false and we were getting the wrong buffer-sizing path. Cc: "11.1 11.2" <mesa-stable@lists.freedesktop.org> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
a7011922f1
commit
a01a1eb9e4
|
@ -963,6 +963,7 @@ struct brw_context
|
||||||
/* Summary of size and varying of active arrays, so we can check
|
/* Summary of size and varying of active arrays, so we can check
|
||||||
* for changes to this state:
|
* for changes to this state:
|
||||||
*/
|
*/
|
||||||
|
bool index_bounds_valid;
|
||||||
unsigned int min_index, max_index;
|
unsigned int min_index, max_index;
|
||||||
|
|
||||||
/* Offset from start of vertex buffer so we can avoid redefining
|
/* Offset from start of vertex buffer so we can avoid redefining
|
||||||
|
|
|
@ -424,6 +424,7 @@ brw_try_draw_prims(struct gl_context *ctx,
|
||||||
const struct _mesa_prim *prims,
|
const struct _mesa_prim *prims,
|
||||||
GLuint nr_prims,
|
GLuint nr_prims,
|
||||||
const struct _mesa_index_buffer *ib,
|
const struct _mesa_index_buffer *ib,
|
||||||
|
bool index_bounds_valid,
|
||||||
GLuint min_index,
|
GLuint min_index,
|
||||||
GLuint max_index,
|
GLuint max_index,
|
||||||
struct brw_transform_feedback_object *xfb_obj,
|
struct brw_transform_feedback_object *xfb_obj,
|
||||||
|
@ -477,6 +478,7 @@ brw_try_draw_prims(struct gl_context *ctx,
|
||||||
brw->ib.ib = ib;
|
brw->ib.ib = ib;
|
||||||
brw->ctx.NewDriverState |= BRW_NEW_INDICES;
|
brw->ctx.NewDriverState |= BRW_NEW_INDICES;
|
||||||
|
|
||||||
|
brw->vb.index_bounds_valid = index_bounds_valid;
|
||||||
brw->vb.min_index = min_index;
|
brw->vb.min_index = min_index;
|
||||||
brw->vb.max_index = max_index;
|
brw->vb.max_index = max_index;
|
||||||
brw->ctx.NewDriverState |= BRW_NEW_VERTICES;
|
brw->ctx.NewDriverState |= BRW_NEW_VERTICES;
|
||||||
|
@ -659,14 +661,15 @@ brw_draw_prims(struct gl_context *ctx,
|
||||||
perf_debug("Scanning index buffer to compute index buffer bounds. "
|
perf_debug("Scanning index buffer to compute index buffer bounds. "
|
||||||
"Use glDrawRangeElements() to avoid this.\n");
|
"Use glDrawRangeElements() to avoid this.\n");
|
||||||
vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, nr_prims);
|
vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, nr_prims);
|
||||||
|
index_bounds_valid = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try drawing with the hardware, but don't do anything else if we can't
|
/* Try drawing with the hardware, but don't do anything else if we can't
|
||||||
* manage it. swrast doesn't support our featureset, so we can't fall back
|
* manage it. swrast doesn't support our featureset, so we can't fall back
|
||||||
* to it.
|
* to it.
|
||||||
*/
|
*/
|
||||||
brw_try_draw_prims(ctx, arrays, prims, nr_prims, ib, min_index, max_index,
|
brw_try_draw_prims(ctx, arrays, prims, nr_prims, ib, index_bounds_valid,
|
||||||
xfb_obj, stream, indirect);
|
min_index, max_index, xfb_obj, stream, indirect);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -493,7 +493,7 @@ brw_prepare_vertices(struct brw_context *brw)
|
||||||
glarray->InstanceDivisor) - 1) +
|
glarray->InstanceDivisor) - 1) +
|
||||||
glarray->_ElementSize);
|
glarray->_ElementSize);
|
||||||
} else {
|
} else {
|
||||||
if (min_index == -1) {
|
if (!brw->vb.index_bounds_valid) {
|
||||||
offset = 0;
|
offset = 0;
|
||||||
size = intel_buffer->Base.Size;
|
size = intel_buffer->Base.Size;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue