nvc0: reset the instanced elements state when doing blit using 3d engine
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 9 May 2015 17:25:51 +0000 (13:25 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 9 May 2015 17:36:23 +0000 (13:36 -0400)
Since we update num_vtxelts here, we could otherwise end up with stale
instancing information in the upper bits which wouldn't otherwise get
reset. (Also we run the risk of the previous draw having set the first
element as instanced.)

This appears as one of the causes for the test pointed out in fdo#90363
to fail on nvc0.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90363
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: mesa-stable@lists.freedesktop.org
src/gallium/drivers/nouveau/nvc0/nvc0_surface.c

index 4404d8c1a745aa34a835866f6dabce18bf9a240d..a820de7259a40f6933be041510ffe78ad0c8b59a 100644 (file)
@@ -1152,6 +1152,12 @@ nvc0_blit_3d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
                       NVC0_3D_VERTEX_ATTRIB_FORMAT_SIZE_32 |
                       NVC0_3D_VERTEX_ATTRIB_FORMAT_CONST);
    }
+   if (nvc0->state.instance_elts) {
+      nvc0->state.instance_elts = 0;
+      BEGIN_NVC0(push, NVC0_3D(MACRO_VERTEX_ARRAY_PER_INSTANCE), 2);
+      PUSH_DATA (push, n);
+      PUSH_DATA (push, 0);
+   }
    nvc0->state.num_vtxelts = 2;
 
    for (i = 0; i < info->dst.box.depth; ++i, z += dz) {