[Mesa-dev] [PATCH 1/3] softpipe: fix streamout with an emptry geometry shader

Jose Fonseca jfonseca at vmware.com
Tue Apr 23 06:11:36 PDT 2013



----- Original Message -----
> Same approach as in the llvmpipe, if the geometry shader is
> null and we have stream output then attach it to the vertex
> shader right before executing the draw pipeline.
> 
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> ---
>  src/gallium/drivers/softpipe/sp_draw_arrays.c  |    7 ++++++
>  src/gallium/drivers/softpipe/sp_state_shader.c |   28
>  ++++++++++++++----------
>  2 files changed, 23 insertions(+), 12 deletions(-)
> 
> diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c
> b/src/gallium/drivers/softpipe/sp_draw_arrays.c
> index 4378312..0eb9c50 100644
> --- a/src/gallium/drivers/softpipe/sp_draw_arrays.c
> +++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c
> @@ -105,6 +105,13 @@ softpipe_draw_vbo(struct pipe_context *pipe,
>     draw_set_mapped_so_targets(draw, sp->num_so_targets,
>                                sp->so_targets);
>  
> +   if (sp->gs && !sp->gs->shader.tokens) {
> +      /* we have an empty geometry shader with stream output, so
> +         attach the stream output info to the current vertex shader */
> +      if (sp->vs) {
> +         draw_vs_attach_so(sp->vs->draw_data,
> &sp->gs->shader.stream_output);
> +      }
> +   }
>     draw_collect_pipeline_statistics(draw,
>                                      sp->active_statistics_queries > 0);
>  
> diff --git a/src/gallium/drivers/softpipe/sp_state_shader.c
> b/src/gallium/drivers/softpipe/sp_state_shader.c
> index 40d32a4..79bd597 100644
> --- a/src/gallium/drivers/softpipe/sp_state_shader.c
> +++ b/src/gallium/drivers/softpipe/sp_state_shader.c
> @@ -275,21 +275,25 @@ softpipe_create_gs_state(struct pipe_context *pipe,
>     if (state == NULL )
>        goto fail;
>  
> -   /* debug */
> -   if (softpipe->dump_gs)
> -      tgsi_dump(templ->tokens, 0);
> +   state->shader = *templ;
>  
> -   /* copy shader tokens, the ones passed in will go away.
> -    */
> -   state->shader.tokens = tgsi_dup_tokens(templ->tokens);
> -   if (state->shader.tokens == NULL)
> -      goto fail;
> +   if (templ->tokens) {
> +      /* debug */
> +      if (softpipe->dump_gs)
> +         tgsi_dump(templ->tokens, 0);
>  
> -   state->draw_data = draw_create_geometry_shader(softpipe->draw, templ);
> -   if (state->draw_data == NULL)
> -      goto fail;
> +      /* copy shader tokens, the ones passed in will go away.
> +       */
> +      state->shader.tokens = tgsi_dup_tokens(templ->tokens);
> +      if (state->shader.tokens == NULL)
> +         goto fail;
>  
> -   state->max_sampler = state->draw_data->info.file_max[TGSI_FILE_SAMPLER];
> +      state->draw_data = draw_create_geometry_shader(softpipe->draw, templ);
> +      if (state->draw_data == NULL)
> +         goto fail;
> +
> +      state->max_sampler =
> state->draw_data->info.file_max[TGSI_FILE_SAMPLER];
> +   }
>  
>     return state;
>  
> --
> 1.7.10.4

Series looks good to me.

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


More information about the mesa-dev mailing list