[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