i965/draw: Stop relying on min_index == -1 for invalid index bounds
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 18 May 2016 18:34:44 +0000 (11:34 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 24 May 2016 02:12:34 +0000 (19:12 -0700)
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>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/i965/brw_draw_upload.c

index 9a4dd31c4bbccfea8c49cb2fc152595f80014a93..c6fb8d277e1a948179ddbe432a56e409dba1a84e 100644 (file)
@@ -963,6 +963,7 @@ struct brw_context
       /* Summary of size and varying of active arrays, so we can check
        * for changes to this state:
        */
+      bool index_bounds_valid;
       unsigned int min_index, max_index;
 
       /* Offset from start of vertex buffer so we can avoid redefining
index bb963f467f94126ab7cefa37c8c6e835bb934377..7901972111f5165d4f7410a3990fed2e9cc35971 100644 (file)
@@ -424,6 +424,7 @@ brw_try_draw_prims(struct gl_context *ctx,
                    const struct _mesa_prim *prims,
                    GLuint nr_prims,
                    const struct _mesa_index_buffer *ib,
+                   bool index_bounds_valid,
                    GLuint min_index,
                    GLuint max_index,
                    struct brw_transform_feedback_object *xfb_obj,
@@ -477,6 +478,7 @@ brw_try_draw_prims(struct gl_context *ctx,
    brw->ib.ib = ib;
    brw->ctx.NewDriverState |= BRW_NEW_INDICES;
 
+   brw->vb.index_bounds_valid = index_bounds_valid;
    brw->vb.min_index = min_index;
    brw->vb.max_index = max_index;
    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.  "
                  "Use glDrawRangeElements() to avoid this.\n");
       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
     * manage it.  swrast doesn't support our featureset, so we can't fall back
     * to it.
     */
-   brw_try_draw_prims(ctx, arrays, prims, nr_prims, ib, min_index, max_index,
-                      xfb_obj, stream, indirect);
+   brw_try_draw_prims(ctx, arrays, prims, nr_prims, ib, index_bounds_valid,
+                      min_index, max_index, xfb_obj, stream, indirect);
 }
 
 void
index 5af458368c82f4a9aeec494d110c8385e8491e9b..3ec37f805e3384d2866a30f45a75113e52e8628e 100644 (file)
@@ -493,7 +493,7 @@ brw_prepare_vertices(struct brw_context *brw)
                                           glarray->InstanceDivisor) - 1) +
                        glarray->_ElementSize);
             } else {
-               if (min_index == -1) {
+               if (!brw->vb.index_bounds_valid) {
                   offset = 0;
                   size = intel_buffer->Base.Size;
                } else {