broadcom/vc5: Disable transform feedback on V3D 4.x at the end of the job.
authorEric Anholt <eric@anholt.net>
Fri, 23 Mar 2018 22:28:40 +0000 (15:28 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 27 Mar 2018 00:46:19 +0000 (17:46 -0700)
The next job from this client will turn it back on unless TF gets
disabled, but we don't want the state to leak from this client to another
(which causes GPU hangs).

src/gallium/drivers/vc5/v3dx_job.c
src/gallium/drivers/vc5/vc5_context.h
src/gallium/drivers/vc5/vc5_emit.c

index d4b0adfea0ac05031f0eaaa95a81ec68ff0f7541..ca3831c75bbaf2dc0c60fe9c47854115591aa4fb 100644 (file)
 void v3dX(bcl_epilogue)(struct vc5_context *vc5, struct vc5_job *job)
 {
                 vc5_cl_ensure_space_with_branch(&job->bcl,
-                                                7 +
-                                                cl_packet_length(OCCLUSION_QUERY_COUNTER));
+                                                cl_packet_length(OCCLUSION_QUERY_COUNTER) +
+#if V3D_VERSION >= 41
+                                                cl_packet_length(TRANSFORM_FEEDBACK_SPECS) +
+#endif
+                                                cl_packet_length(INCREMENT_SEMAPHORE) +
+                                                cl_packet_length(FLUSH_ALL_STATE));
 
                 if (job->oq_enabled) {
                         /* Disable the OQ at the end of the CL, so that the
@@ -44,6 +48,19 @@ void v3dX(bcl_epilogue)(struct vc5_context *vc5, struct vc5_job *job)
                         cl_emit(&job->bcl, OCCLUSION_QUERY_COUNTER, counter);
                 }
 
+                /* Disable TF at the end of the CL, so that the next job to be
+                 * run doesn't start out trying to write TF primitives.  On
+                 * V3D 3.x, it's only the TF primitive mode that triggers TF
+                 * writes.
+                 */
+#if V3D_VERSION >= 41
+                if (job->tf_enabled) {
+                        cl_emit(&job->bcl, TRANSFORM_FEEDBACK_SPECS, tfe) {
+                                tfe.enable = false;
+                        };
+                }
+#endif /* V3D_VERSION >= 41 */
+
                 /* Increment the semaphore indicating that binning is done and
                  * unblocking the render thread.  Note that this doesn't act
                  * until the FLUSH completes.
index 7272e045c4fcec4bd6da4dc0329b67713e79312a..f6ed91c27ae52a3a80026dfd57dc3c23493317b5 100644 (file)
@@ -294,6 +294,12 @@ struct vc5_job {
          */
         bool oq_enabled;
 
+        /**
+         * Set when a packet enabling TF on all further primitives has been
+         * emitted.
+         */
+        bool tf_enabled;
+
         bool uses_early_z;
 
         /**
index 061d6e7c9d9da5f64cfc42c1a20a877349543049..a98fd037d089619871c0f2889dbf8882434f9154 100644 (file)
@@ -585,12 +585,13 @@ v3dX(emit_state)(struct pipe_context *pctx)
                                               vc5->prog.bind_vs->tf_specs);
 
 #if V3D_VERSION >= 40
+                        job->tf_enabled = (vc5->prog.bind_vs->num_tf_specs != 0 &&
+                                           vc5->active_queries);
+
                         cl_emit(&job->bcl, TRANSFORM_FEEDBACK_SPECS, tfe) {
                                 tfe.number_of_16_bit_output_data_specs_following =
                                         vc5->prog.bind_vs->num_tf_specs;
-                                tfe.enable =
-                                        (vc5->prog.bind_vs->num_tf_specs != 0 &&
-                                         vc5->active_queries);
+                                tfe.enable = job->tf_enabled;
                         };
 #else /* V3D_VERSION < 40 */
                         cl_emit(&job->bcl, TRANSFORM_FEEDBACK_ENABLE, tfe) {