vc4: Move job-submit skip cases to vc4_job_submit().
[mesa.git] / src / gallium / drivers / vc4 / vc4_job.c
index 41660f6ac4daffef78ecddb32dc2be651a7ab6ff..e71f6f4cf9105ba7db8a7924e7776662f8c2c569 100644 (file)
@@ -170,11 +170,37 @@ vc4_submit_setup_rcl_msaa_surface(struct vc4_context *vc4,
 void
 vc4_job_submit(struct vc4_context *vc4)
 {
+        if (!vc4->needs_flush)
+                return;
+
+        /* The RCL setup would choke if the draw bounds cause no drawing, so
+         * just drop the drawing if that's the case.
+         */
+        if (vc4->draw_max_x <= vc4->draw_min_x ||
+            vc4->draw_max_y <= vc4->draw_min_y) {
+                vc4_job_reset(vc4);
+                return;
+        }
+
         if (vc4_debug & VC4_DEBUG_CL) {
                 fprintf(stderr, "BCL:\n");
                 vc4_dump_cl(vc4->bcl.base, cl_offset(&vc4->bcl), false);
         }
 
+        if (cl_offset(&vc4->bcl) > 0) {
+                /* Increment the semaphore indicating that binning is done and
+                 * unblocking the render thread.  Note that this doesn't act
+                 * until the FLUSH completes.
+                 */
+                cl_ensure_space(&vc4->bcl, 8);
+                struct vc4_cl_out *bcl = cl_start(&vc4->bcl);
+                cl_u8(&bcl, VC4_PACKET_INCREMENT_SEMAPHORE);
+                /* The FLUSH caps all of our bin lists with a
+                 * VC4_PACKET_RETURN.
+                 */
+                cl_u8(&bcl, VC4_PACKET_FLUSH);
+                cl_end(&vc4->bcl, bcl);
+        }
         struct drm_vc4_submit_cl submit;
         memset(&submit, 0, sizeof(submit));