summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/v3d/v3d_context.h6
-rw-r--r--src/gallium/drivers/v3d/v3d_job.c10
-rw-r--r--src/gallium/drivers/v3d/v3dx_draw.c2
3 files changed, 17 insertions, 1 deletions
diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h
index 4ff17da66cb..9022ac351d4 100644
--- a/src/gallium/drivers/v3d/v3d_context.h
+++ b/src/gallium/drivers/v3d/v3d_context.h
@@ -413,6 +413,12 @@ struct v3d_job {
*/
uint32_t draw_calls_queued;
+ /**
+ * Number of draw calls (not counting full buffer clears) queued in
+ * the current job during active transform feedback.
+ */
+ uint32_t tf_draw_calls_queued;
+
struct v3d_job_key key;
};
diff --git a/src/gallium/drivers/v3d/v3d_job.c b/src/gallium/drivers/v3d/v3d_job.c
index d16896ce0d8..db2ce0a85be 100644
--- a/src/gallium/drivers/v3d/v3d_job.c
+++ b/src/gallium/drivers/v3d/v3d_job.c
@@ -526,8 +526,16 @@ v3d_job_submit(struct v3d_context *v3d, struct v3d_job *job)
* feedback we need to read the primitive counts and accumulate
* them, otherwise they will be reset at the start of the next
* draw when we emit the Tile Binning Mode Configuration packet.
+ *
+ * If the job doesn't have any TF draw calls, then we know
+ * the primitive count must be zero and we can skip stalling
+ * for this. This also fixes a problem because it seems that
+ * in this scenario the counters are not reset with the Tile
+ * Binning Mode Configuration packet, which would translate
+ * to us reading an obsolete (possibly non-zero) value from
+ * the GPU counters.
*/
- if (v3d->streamout.num_targets)
+ if (v3d->streamout.num_targets && job->tf_draw_calls_queued > 0)
v3d_read_and_accumulate_primitive_counters(v3d);
}
diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c
index 2eed8f1786a..efc8d249dce 100644
--- a/src/gallium/drivers/v3d/v3dx_draw.c
+++ b/src/gallium/drivers/v3d/v3dx_draw.c
@@ -897,6 +897,8 @@ v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
cl_emit(&job->bcl, TRANSFORM_FEEDBACK_FLUSH_AND_COUNT, flush);
job->draw_calls_queued++;
+ if (v3d->streamout.num_targets)
+ job->tf_draw_calls_queued++;
/* Increment the TF offsets by how many verts we wrote. XXX: This
* needs some clamping to the buffer size.