Kenneth Graunke <[email protected]> writes: > Implementing the GetTransformFeedbackVertexCount() driver hook allows > the VBO module to call us with the right number of vertices. > > The hardware doesn't directly count the number of vertices written by > SOL, so we instead use the SO_NUM_PRIMS_WRITTEN(n) counters and multiply > by the number of vertices per primitive. > > Unfortunately, counting the number of primitives generated is tricky: > a program might pause a transform feedback operation, start a second one > with a different object, then switch back and resume. Both transform > feedback operations share the SO_NUM_PRIMS_WRITTEN counters. > > To work around this, we save the counter values at Begin, Pause, Resume, > and End. This "bookends" each section where transform feedback is > active for the current object. Adding up differences of pairs gives > us the number of primitives generated. (This is similar to what we > do for occlusion queries on platforms without hardware contexts.) > > Signed-off-by: Kenneth Graunke <[email protected]> > --- > src/mesa/drivers/dri/i965/brw_context.c | 2 + > src/mesa/drivers/dri/i965/brw_context.h | 26 ++++ > src/mesa/drivers/dri/i965/gen6_sol.c | 1 + > src/mesa/drivers/dri/i965/gen7_sol_state.c | 190 > ++++++++++++++++++++++++++++- > 4 files changed, 218 insertions(+), 1 deletion(-)
> +/**
> + * Tally the number of primitives generated so far.
> + *
> + * The buffer contains a series of pairs:
> + * (<start0, start1, start2, start3>, <end0, end1, end2, end3>) ;
> + * (<start0, start1, start2, start3>, <end0, end1, end2, end3>) ;
> + *
> + * For each stream, we subtract the pair of values (end - start) to get the
> + * number of primitives generated during one section. We accumulate these
> + * values, adding them up to get the total number of primitives generated.
> + */
> +static void
> +gen7_tally_prims_generated(struct brw_context *brw,
> + struct brw_transform_feedback_object *obj)
> +{
> + /* If the current batch is still contributing to the number of primitives
> + * generated, flush it now so the results will be present when mapped.
> + */
> + if (drm_intel_bo_references(brw->batch.bo, obj->prim_count_bo))
> + intel_batchbuffer_flush(brw);
> +
> + if (unlikely(brw->perf_debug && drm_intel_bo_busy(obj->prim_count_bo)))
> + perf_debug("Stalling for # of transform feedback primitives
> written.\n");
> +
> + drm_intel_bo_map(obj->prim_count_bo, false);
> + uint64_t *prim_counts = obj->prim_count_bo->virtual;
> +
> + assert(obj->prim_count_buffer_index % 2 * BRW_MAX_XFB_STREAMS == 0);
I think you want parens around "2 * BRW_MAX_XFB_STREAMS" here.
I was really impressed with how legible I found this patch. Thanks!
All but patches 4, 9 are:
Reviewed-by: Eric Anholt <[email protected]>
and 9 gets r-b with the obvious change.
pgpFAU3WwDDJ9.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
