panfrost: Fix faults with RASTERIZER_DISCARD
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 16 Jul 2020 17:33:32 +0000 (13:33 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 16 Jul 2020 19:59:43 +0000 (19:59 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5858>

src/gallium/drivers/panfrost/pan_job.c

index c495d6133e6a606ee707e433cff5e079e28ac2b9..5a89825bb86152aacda794f482c819075b2dfe82 100644 (file)
@@ -1082,7 +1082,15 @@ panfrost_batch_submit_jobs(struct panfrost_batch *batch)
         }
 
         if (batch->scoreboard.tiler_dep || batch->clear) {
-                mali_ptr fragjob = panfrost_fragment_job(batch, has_draws);
+                /* Whether we program the fragment job for draws or not depends
+                 * on whether there is any *tiler* activity (so fragment
+                 * shaders). If there are draws but entirely RASTERIZER_DISCARD
+                 * (say, for transform feedback), we want a fragment job that
+                 * *only* clears, since otherwise the tiler structures will be
+                 * uninitialized leading to faults (or state leaks) */
+
+                mali_ptr fragjob = panfrost_fragment_job(batch,
+                                batch->scoreboard.tiler_dep != 0);
                 ret = panfrost_batch_submit_ioctl(batch, fragjob, PANFROST_JD_REQ_FS);
                 assert(!ret);
         }