iris: Zero the compute predicate when changing the render condition
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 22 Jan 2019 22:22:55 +0000 (14:22 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:11 +0000 (10:26 -0800)
1. Set a render condition.  We emit it immediately on the render
   engine, and stash q->bo as ice->state.compute_predicate in case
   the compute engine needs it.

2. Clear the render condition.  We were incorrectly leaving a stale
   compute_predicate kicking around...

3. Dispatch compute.  We would then read the stale compute predicate,
   and try to load it into MI_PREDICATE_DATA.  But q->bo may have been
   freed altogether, causing us to try and use garbage memory as a BO,
   adding it to the validation list, failing asserts, and tripping
   EINVALs in execbuf.

Huge thanks to Mark Janes for narrowing this sporadic GL CTS failure
down to a list of 48 tests I could easily run to reproduce it.  Huge
thanks to the Valgrind authors for the memcheck tool that immediately
pinpointed the problem.

src/gallium/drivers/iris/iris_query.c

index 66169d1db05d0155d0a6c00867eaa336e04205ad..4cb59d40949875660123fd05568737061a18a4f3 100644 (file)
@@ -1028,6 +1028,9 @@ iris_render_condition(struct pipe_context *ctx,
    struct iris_context *ice = (void *) ctx;
    struct iris_query *q = (void *) query;
 
+   /* The old condition isn't relevant; we'll update it if necessary */
+   ice->state.compute_predicate = NULL;
+
    if (!q) {
       ice->state.predicate = IRIS_PREDICATE_STATE_RENDER;
       return;