[Mesa-dev] [PATCH 4/5] i965 gen6: Implement transform feedback pause/resume functionality.

Kenneth Graunke kenneth at whitecape.org
Thu Dec 22 10:48:13 PST 2011


On 12/21/2011 01:39 PM, Paul Berry wrote:
> Although i965 gen6 does not yet support ARB_transform_feedback2 or
> NV_transform_feedback2, it needs to support pause/resume functionality
> so that meta-ops will work correctly.
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c |    3 ++-
>  src/mesa/drivers/dri/i965/brw_gs.c   |    3 ++-
>  src/mesa/drivers/dri/i965/gen6_sol.c |    3 ++-
>  3 files changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
> index 082bb9a..93f27d7 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -389,7 +389,8 @@ brw_update_primitive_count(struct brw_context *brw,
>  {
>     uint32_t count = count_tessellated_primitives(prim);
>     brw->sol.primitives_generated += count;
> -   if (brw->intel.ctx.TransformFeedback.CurrentObject->Active) {
> +   if (brw->intel.ctx.TransformFeedback.CurrentObject->Active &&
> +       !brw->intel.ctx.TransformFeedback.CurrentObject->Paused) {
>        /* Update brw->sol.svbi_0_max_index to reflect the amount by which the
>         * hardware is going to increment SVBI 0 when this drawing operation
>         * occurs.  This is necessary because the kernel does not (yet) save and
> diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
> index 886bf98..850d7b4 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs.c
> +++ b/src/mesa/drivers/dri/i965/brw_gs.c
> @@ -183,7 +183,8 @@ static void populate_key( struct brw_context *brw,
>     } else if (intel->gen == 6) {
>        /* On Gen6, GS is used for transform feedback. */
>        /* _NEW_TRANSFORM_FEEDBACK */
> -      if (ctx->TransformFeedback.CurrentObject->Active) {
> +      if (ctx->TransformFeedback.CurrentObject->Active &&
> +          !ctx->TransformFeedback.CurrentObject->Paused) {
>           const struct gl_shader_program *shaderprog =
>              ctx->Shader.CurrentVertexProgram;
>           const struct gl_transform_feedback_info *linked_xfb_info =

Nevermind, I answered my own question.  I was wondering if Paused needed
to be in the key, and how you got updates about it changing.  But no,
putting it in the key would be bizarre, and the _NEW_TRANSFORM_FEEDBACK
dirty bit covers this.

For the whole series:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

> diff --git a/src/mesa/drivers/dri/i965/gen6_sol.c b/src/mesa/drivers/dri/i965/gen6_sol.c
> index 5d11481..32f56d3 100644
> --- a/src/mesa/drivers/dri/i965/gen6_sol.c
> +++ b/src/mesa/drivers/dri/i965/gen6_sol.c
> @@ -47,7 +47,8 @@ gen6_update_sol_surfaces(struct brw_context *brw)
>  
>     for (i = 0; i < BRW_MAX_SOL_BINDINGS; ++i) {
>        const int surf_index = SURF_INDEX_SOL_BINDING(i);
> -      if (xfb_obj->Active && i < linked_xfb_info->NumOutputs) {
> +      if (xfb_obj->Active && !xfb_obj->Paused &&
> +          i < linked_xfb_info->NumOutputs) {
>           unsigned buffer = linked_xfb_info->Outputs[i].OutputBuffer;
>           unsigned buffer_offset =
>              xfb_obj->Offset[buffer] / 4 +



More information about the mesa-dev mailing list