broadcom/vc5: Disable transform feedback on V3D 4.x at the end of the job.

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).
This commit is contained in:
Eric Anholt
2018-03-23 15:28:40 -07:00
parent 1fa820cef8
commit ef2cf9cc3c
3 changed files with 29 additions and 5 deletions

View File

@@ -33,8 +33,12 @@
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.

View 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;
/**

View 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) {