i965: Flush pipeline on EndTransformFeedback.
authorPaul Berry <stereotype441@gmail.com>
Sat, 10 Dec 2011 00:40:32 +0000 (16:40 -0800)
committerPaul Berry <stereotype441@gmail.com>
Tue, 20 Dec 2011 23:00:29 +0000 (15:00 -0800)
commit63cf7fad13fc9cfdd2ae7b031426f79107000300
tree1db2139bac237abcd17886292b9bd51e97583934
parentc3161b629f342b21756f4fdb4414417b82d3e033
i965: Flush pipeline on EndTransformFeedback.

A common use case for transform feedback is to perform one draw
operation that writes transform feedback output to a buffer, followed
by a second draw operation that consumes that buffer as vertex input.
Since vertex input is consumed at an earlier pipeline stage than
writing transform feedback output, we need to flush the pipeline to
ensure that the transform feedback output is completely written before
the data is consumed.

In an ideal world, we would do some dependency tracking, so that we
would only flush the pipeline if the next draw call was about to
consume data generated by a previous draw call in the same batch.
However, since we don't have that sort of dependency tracking
infrastructure right now, we just unconditionally flush the buffer
every time glEndTransformFeedback() is called.  This will cause a
performance hit compared to the ideal case (since we will sometimes
flush the pipeline unnecessarily), but fortunately the performance hit
will be confined to circumstances where transform feedback is in use.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/gen6_sol.c