Mesa (staging/21.0): mesa: always set valid index bounds for non-indexed draws for classic drivers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 15 17:20:59 UTC 2021


Module: Mesa
Branch: staging/21.0
Commit: a6ace60672b1558103719c7a0d38c7ad4422da22
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a6ace60672b1558103719c7a0d38c7ad4422da22

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Tue Jan 12 14:45:03 2021 -0500

mesa: always set valid index bounds for non-indexed draws for classic drivers

This should fix crashing piglit tests on the i915 classic driver.

Fixes: 2358da81d26 - mesa: switch (Multi)DrawArrays to DrawGallium

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8453>
(cherry picked from commit 39c415d5fd496b64f8fda2ea47b6adb88b9bd51e)

---

 .pick_status.json    |  2 +-
 src/mesa/main/draw.c | 35 +++++++++++++++++++++++++++++++----
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 8f0194a8349..858a7ab776e 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -535,7 +535,7 @@
         "description": "mesa: always set valid index bounds for non-indexed draws for classic drivers",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": "2358da81d26d8baa2a46a7e854869d1c02c2dc38"
     },
diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c
index eedf9c41167..669f0c5375e 100644
--- a/src/mesa/main/draw.c
+++ b/src/mesa/main/draw.c
@@ -91,12 +91,26 @@ _mesa_draw_gallium_fallback(struct gl_context *ctx,
 {
    struct _mesa_index_buffer ib;
    unsigned index_size = info->index_size;
-   unsigned min_index = info->index_bounds_valid ? info->min_index : 0;
-   unsigned max_index = info->index_bounds_valid ? info->max_index : ~0;
+   unsigned min_index = 0, max_index = ~0u;
+   bool index_bounds_valid = false;
 
    if (!info->instance_count)
       return;
 
+   if (index_size) {
+      if (info->index_bounds_valid) {
+         min_index = info->min_index;
+         max_index = info->max_index;
+         index_bounds_valid = true;
+      }
+   } else {
+      /* The index_bounds_valid field and min/max_index are not used for
+       * non-indexed draw calls (they are undefined), but classic drivers
+       * need the index bounds. They will be computed manually.
+       */
+      index_bounds_valid = true;
+   }
+
    ib.index_size_shift = util_logbase2(index_size);
 
    /* Single draw or a fallback for user indices. */
@@ -132,8 +146,13 @@ _mesa_draw_gallium_fallback(struct gl_context *ctx,
          prim.basevertex = index_size ? info->index_bias : 0;
          prim.draw_id = info->drawid + (info->increment_draw_id ? i : 0);
 
+         if (!index_size) {
+            min_index = draws[i].start;
+            max_index = draws[i].start + draws[i].count - 1;
+         }
+
          ctx->Driver.Draw(ctx, &prim, 1, index_size ? &ib : NULL,
-                          info->index_bounds_valid, info->primitive_restart,
+                          index_bounds_valid, info->primitive_restart,
                           info->restart_index, min_index, max_index,
                           info->instance_count, info->start_instance);
       }
@@ -146,6 +165,9 @@ _mesa_draw_gallium_fallback(struct gl_context *ctx,
 
    ALLOC_PRIMS(prim, num_draws, "DrawGallium");
 
+   min_index = ~0u;
+   max_index = 0;
+
    for (unsigned i = 0; i < num_draws; i++) {
       if (!draws[i].count)
          continue;
@@ -158,6 +180,11 @@ _mesa_draw_gallium_fallback(struct gl_context *ctx,
       prim[num_prims].basevertex = info->index_size ? info->index_bias : 0;
       prim[num_prims].draw_id = info->drawid + (info->increment_draw_id ? i : 0);
 
+      if (!index_size) {
+         min_index = MIN2(min_index, draws[i].start);
+         max_index = MAX2(max_index, draws[i].start + draws[i].count - 1);
+      }
+
       max_count = MAX2(max_count, prim[num_prims].count);
       num_prims++;
    }
@@ -176,7 +203,7 @@ _mesa_draw_gallium_fallback(struct gl_context *ctx,
    }
 
    ctx->Driver.Draw(ctx, prim, num_prims, index_size ? &ib : NULL,
-                    info->index_bounds_valid, info->primitive_restart,
+                    index_bounds_valid, info->primitive_restart,
                     info->restart_index, min_index, max_index,
                     info->instance_count, info->start_instance);
    FREE_PRIMS(prim, num_draws);



More information about the mesa-commit mailing list