panfrost: Clamp tile coordinates before job submission
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sun, 23 Jun 2019 18:20:00 +0000 (11:20 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 25 Jun 2019 20:39:17 +0000 (13:39 -0700)
Fixes TILE_RANGE_FAULT raised on some tests in
dEQP-GLES3.functional.fbo.blit.*

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_fragment.c

index d6b8afdc6b946422c517999892fa7df641a9ef4f..5dbca021141e1471ec538a047687e3ae0260f54f 100644 (file)
@@ -69,6 +69,26 @@ panfrost_fragment_job(struct panfrost_context *ctx, bool has_draws)
 
         struct panfrost_job *job = panfrost_get_job_for_fbo(ctx);
 
+        /* The passed tile coords can be out of range in some cases, so we need
+         * to clamp them to the framebuffer size to avoid a TILE_RANGE_FAULT.
+         * Theoretically we also need to clamp the coordinates positive, but we
+         * avoid that edge case as all four values are unsigned. Also,
+         * theoretically we could clamp the minima, but if that has to happen
+         * the asserts would fail anyway (since the maxima would get clamped
+         * and then be smaller than the minima). An edge case of sorts occurs
+         * when no scissors are added to draw, so by default min=~0 and max=0.
+         * But that can't happen if any actual drawing occurs (beyond a
+         * wallpaper reload), so this is again irrelevant in practice. */
+
+        job->maxx = MIN2(job->maxx, fb->width);
+        job->maxy = MIN2(job->maxy, fb->height);
+
+        /* Rendering region must be at least 1x1; otherwise, there is nothing
+         * to do and the whole job chain should have been discarded. */
+
+        assert(job->maxx > job->minx);
+        assert(job->maxy > job->miny);
+
         struct mali_payload_fragment payload = {
                 .min_tile_coord = MALI_COORDINATE_TO_TILE_MIN(job->minx, job->miny),
                 .max_tile_coord = MALI_COORDINATE_TO_TILE_MAX(job->maxx, job->maxy),