diff options
-rw-r--r-- | src/gallium/drivers/vc5/v3dx_job.c | 21 | ||||
-rw-r--r-- | src/gallium/drivers/vc5/vc5_context.h | 6 | ||||
-rw-r--r-- | src/gallium/drivers/vc5/vc5_emit.c | 7 |
3 files changed, 29 insertions, 5 deletions
diff --git a/src/gallium/drivers/vc5/v3dx_job.c b/src/gallium/drivers/vc5/v3dx_job.c index d4b0adfea0a..ca3831c75bb 100644 --- a/src/gallium/drivers/vc5/v3dx_job.c +++ b/src/gallium/drivers/vc5/v3dx_job.c @@ -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. diff --git a/src/gallium/drivers/vc5/vc5_context.h b/src/gallium/drivers/vc5/vc5_context.h index 7272e045c4f..f6ed91c27ae 100644 --- a/src/gallium/drivers/vc5/vc5_context.h +++ b/src/gallium/drivers/vc5/vc5_context.h @@ -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; /** diff --git a/src/gallium/drivers/vc5/vc5_emit.c b/src/gallium/drivers/vc5/vc5_emit.c index 061d6e7c9d9..a98fd037d08 100644 --- a/src/gallium/drivers/vc5/vc5_emit.c +++ b/src/gallium/drivers/vc5/vc5_emit.c @@ -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) { |