[Mesa-dev] [PATCH v2] nv50, nvc0: fix push hint logic in presence of a start offset

Ilia Mirkin imirkin at alum.mit.edu
Wed Oct 11 04:00:48 UTC 2017


Previously buffer offsets were passed in explicitly as an offset, which
had to be added to the resource address. Now they are passed in via an
increased 'start' parameter. As a result, we were double-adding the
start offset in this kind of situation.

This condition was triggered by piglit's draw-elements test which has a
requisite glMultiDrawElements in combination with a small enough number
of vertices to go through the immediate push path.

Reported-by: Karol Herbst <karolherbst at gmail.com>
Fixes: 330d0607ed6 ("gallium: remove pipe_index_buffer and set_index_buffer")
Cc: mesa-stable at lists.freedesktop.org
---

v1 -> v2: also do it for nv50

 src/gallium/drivers/nouveau/nv50/nv50_push.c          | 3 +--
 src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c | 9 ++++-----
 2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/nouveau/nv50/nv50_push.c b/src/gallium/drivers/nouveau/nv50/nv50_push.c
index 9ee9a8eed19..bec2d42e037 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_push.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_push.c
@@ -279,8 +279,7 @@ nv50_push_vbo(struct nv50_context *nv50, const struct pipe_draw_info *info)
    if (info->index_size) {
       if (!info->has_user_indices) {
          ctx.idxbuf = nouveau_resource_map_offset(&nv50->base,
-            nv04_resource(info->index.resource), info->start * info->index_size,
-            NOUVEAU_BO_RD);
+            nv04_resource(info->index.resource), 0, NOUVEAU_BO_RD);
       } else {
          ctx.idxbuf = info->index.user;
       }
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c
index f05618f6596..256e20df2e4 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c
@@ -84,13 +84,12 @@ nvc0_vertex_configure_translate(struct nvc0_context *nvc0, int32_t index_bias)
 
 static inline void
 nvc0_push_map_idxbuf(struct push_context *ctx, struct nvc0_context *nvc0,
-                     const struct pipe_draw_info *info,
-                     unsigned offset)
+                     const struct pipe_draw_info *info)
 {
    if (!info->has_user_indices) {
       struct nv04_resource *buf = nv04_resource(info->index.resource);
-      ctx->idxbuf = nouveau_resource_map_offset(&nvc0->base,
-         buf, offset, NOUVEAU_BO_RD);
+      ctx->idxbuf = nouveau_resource_map_offset(
+            &nvc0->base, buf, 0, NOUVEAU_BO_RD);
    } else {
       ctx->idxbuf = info->index.user;
    }
@@ -509,7 +508,7 @@ nvc0_push_vbo(struct nvc0_context *nvc0, const struct pipe_draw_info *info)
    nvc0->state.prim_restart = info->primitive_restart;
 
    if (info->index_size) {
-      nvc0_push_map_idxbuf(&ctx, nvc0, info, info->start * info->index_size);
+      nvc0_push_map_idxbuf(&ctx, nvc0, info);
       index_size = info->index_size;
    } else {
       if (unlikely(info->count_from_stream_output)) {
-- 
2.13.6



More information about the mesa-dev mailing list